考虑以下示例:

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其他整数类型如charunsigned 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>(),有一个统一的定义读取所有整数类型?

更新:奖金问题:如果我想要什么基础上的一些特质接受类以上的范围是多少?例如:我应该如何处理这个问题,如果我想有接受(I)积分类型(II)的浮点类型(III)的串,分别3个get功能

有帮助吗?

解决方案

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

更新“如果我要接受比基于一些traits类一个范围更是什么?”

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

其他提示

推迟到另一个的模板。这里有你想要的东西的一般模式:

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>
{
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top