get
无法推断出第二个模板参数,因为它只显示为返回类型:谁说这get<Tag1>()
是对特定的调用get<Tag1, double>
而不是对 eg的调用get<Tag1, int>
?例如,如果您要调用,get<Tag1, double>()
那么调用将被解析为正确的专业化。
但是我怀疑您并不想get
成为具有两个模板参数的函数模板:返回类型可能旨在成为第一个参数的函数。因此,我建议您get
这样声明:
namespace result_of {
template<typename T>
struct get;
}
template<typename T>
typename result_of::get<T>::type get();
whereresult_of::get
将是计算预期结果类型的元函数。get
为了让事情更简单,我们将把所有的鸡蛋都放在result_of::get
篮子里,而不是专门化函数模板:
namespace result_of {
template<typename T>
struct get;
}
template<typename T>
typename result_of::get<T>::type get()
{ return result_of::get<T>::apply(); }
namespace result_of {
template<>
struct get<Tag1> {
typedef double type;
static type apply()
{ return 1.3; }
};
template<>
struct get<Tag2> {
typedef const char* type;
static type apply()
{ return "hello"; }
};
}
一般来说,特化类模板而不是函数模板更为常见,并且看起来需要特化函数模板的情况通常通过让函数模板将其实现完全委托给类模板来简化。