如何为具有特定类型特征的所有类型编写函数模板?

TC.*_*TC. 7 c++ metaprogramming enable-if

请考虑以下示例:

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>();
}
Run Code Online (Sandbox Code Playgroud)

所述Scanner类被用来提取从一些源令牌.上面的代码工作正常,但是当我尝试get其他整数类型如a char或an 时失败unsigned int.读取这些类型的代码与要读取的代码完全相同int.我可以复制我想要阅读的所有其他整数类型的代码,但我宁愿为所有整数类型定义一个函数模板.

我尝试过以下方法:

struct Scanner
{
    template <typename T>
    typename enable_if<boost::is_integral<T>, T>::type get();
};
Run Code Online (Sandbox Code Playgroud)

这有点像魅力,但我不确定如何Scanner::get<string>()再次运作.所以,我怎么能写代码,这样我可以做scanner.get<string>()scanner.get<any integral type>(),有一个统一的定义读取所有整数类型?

更新:奖金问题:如果我想根据某些特征接受多个课程范围怎么办?例如:如果我想要有三个get函数分别接受(i)整数类型(ii)浮点类型(iii)字符串,我应该如何处理这个问题 .

Ser*_*kov 10

struct Scanner
{
    template <typename T>
    typename boost::enable_if<boost::is_integral<T>, T>::type get()
    {
        return 10;
    }
    template <typename T>
    typename boost::disable_if<boost::is_integral<T>, std::string>::type get()
    {
        return "string";
    }
};
Run Code Online (Sandbox Code Playgroud)

更新"如果我想根据某些特征接受多个类别,该怎么办?"

struct Scanner
{
    template <typename T>
    typename boost::enable_if<boost::is_integral<T>, T>::type get()
    {
        return 10;
    }

    template <typename T>
    typename boost::enable_if<boost::is_floating_point<T>, T>::type get()
    {
        return 11.5;
    }

    template <typename T>
    std::string get(
          typename boost::disable_if<boost::is_floating_point<T>, T>::type* = 0, 
          typename boost::disable_if<boost::is_integral<T>, T>::type* = 0)

    {
        return std::string("string");
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 我想说你可以使用`boost :: mpl :: and_`和`boost :: mpl :: or_`来组合`disable_if`中的参数.尽管如此:) (2认同)