考虑下面的例子:如何为具有特定类型特征的所有类型编写函数模板?
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)字符串,我该如何处理这个问题。
我会说,你可以使用'boost :: mpl :: and_'和'boost :: mpl :: or_'来结合'disable_if'中的参数。 +1尽管如此:) – 2010-03-29 12:54:43
您也可以使用Boost库中的'ice_and'和'ice_or'。 – 2010-03-29 14:02:01