在处理项目时,我遇到了这个代码,我想弄清楚:
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。
答案 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::max
或std::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