C++-定义2个模板参数,但只调用1个

C++ - Defining 2 template parameters but calling with only 1

本文关键字:调用 1个 参数 定义 2个 C++-      更新时间:2023-10-16

在进行一个项目时,我发现了以下代码,我正在努力弄清楚:

enum Attributes { ACTIVE, COMPLETE, POSITION }
template<Attributes NN,typename TT>  
TT& Set(TT&& t) 
{ 
    return typeList.get<NN>()=t; //typeList is a boost tuple
}

这在稍后的中被调用

object.Set<ACTIVE>(true);

那里只有一个模板参数!如何用两个参数指定一个模板,然后只用一个参数调用它?我认为Set方法应该采用两个模板参数(Attributes和typename),就像std::map一样。

第二个是根据传递给函数的参数类型推导的,在本例中为bool

当调用函数模板模板参数时,模板参数是函数参数的类型,可以从参数的类型中自动推导出来,函数调用时使用:

object.Set<ACTIVE>(true); //same as object.Set<Active,bool>(true);
object.Set<ACTIVE>(5);    //same as object.Set<Active,int>(5);

这就是为什么可以使用标准库中的模板函数,如std::maxstd::copy,而不必明确提及参数的类型。

阅读本文

当引用函数模板专用化时模板参数应具有值。这些值可以显式指定的,或者在某些情况下,从使用中推断出来,或者从默认模板参数。

[ Example:
void f(Array<dcomplex>& cv, Array<int>& ci) {
sort(cv); // calls sort(Array<dcomplex>&)
sort(ci); // calls sort(Array<int>&)
}
and
void g(double d) {
int i = convert<int>(d); // calls convert<int,double>(double)
int c = convert<char>(d); // calls convert<char,double>(double)
}
—end example ]

以及本文件第14.8.2段。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf