3

在做一个项目时,我遇到了这段代码,我试图弄清楚:

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 个模板参数(属性和类型名),例如 std::map。

4

3 回答 3

3

第二个是从传递给函数的参数类型推导出来的,在这种情况下bool

于 2012-07-26T20:06:42.190 回答
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是否明确提及参数的类型。

于 2012-07-26T20:07:31.120 回答
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

于 2012-07-26T20:14:15.130 回答