【发布时间】:2010-03-29 10:35:20
【问题描述】:
考虑以下示例:
struct Scanner
{
template <typename T>
T get();
};
template <>
string Scanner::get()
{
return string("string");
}
template <>
int Scanner::get()
{
return 10;
}
int main()
{
Scanner scanner;
string s = scanner.get<string>();
int i = scanner.get<int>();
}
Scanner 类用于从某个来源提取令牌。上面的代码工作正常,但是当我尝试get 其他整数类型(如char 或unsigned int)时失败。读取这些类型的代码与读取int 的代码完全相同。我可以为我想阅读的所有其他整数类型复制代码,但我宁愿为所有整数类型定义一个函数模板。
我尝试了以下方法:
struct Scanner
{
template <typename T>
typename enable_if<boost::is_integral<T>, T>::type get();
};
这就像一个魅力,但我不确定如何让Scanner::get<string>() 再次发挥作用。那么,我该如何编写代码,以便我可以执行 scanner.get<string>() 和 scanner.get<any integral type>() 并有一个定义来读取所有整数类型?
更新:额外问题:如果我想根据某些特征接受多个类别的课程怎么办?例如:如果我想要三个 get 函数分别接受 (i) 整数类型 (ii) 浮点类型 (iii) 字符串,我应该如何解决这个问题。
【问题讨论】:
标签: c++ metaprogramming enable-if