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

时间:2012-07-26 20:05:19

标签: c++ templates

在处理项目时,我遇到了这个代码,我想弄清楚:

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方法应该采用2个模板参数(Attributes和typename),就像std :: map。

3 个答案:

答案 0 :(得分:2)

第二个是从传递给函数的参数类型推导出来的,在本例中是bool

答案 1 :(得分:1)

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

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,而没有明确提及参数的类型。

答案 2 :(得分:1)

阅读本文。

  

当引用函数模板特化时,所有的   模板参数应具有值。值可以明确   指定或在某些情况下,从使用中推断出或从中获得   默认模板参数。

[ 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