7

考虑以下示例:

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其他整数类型(如 achar或 an )时失败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)字符串,我应该如何解决这个问题。

4

2 回答 2

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";
    }
};

更新“如果我想根据某些特征接受多个类别的课程怎么办?”

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");
    }
};
于 2010-03-29T10:57:14.097 回答
3

推迟到另一个模板。这是您想要的一般模式:

template <typename T, bool HasTrait = false>
struct scanner_impl;

template <typename T>
struct scanner_impl
{
    // Implement as though the trait is false
};

template <typename T>
struct scanner_impl<true>
{
    // Implement as though the trait is true
};

// This is the one the user uses
template <typename T>
struct scanner : scanner_impl<T, typename has_my_trait<T>::value>
{
};
于 2010-03-29T10:53:34.233 回答