如何专门化这个模板(注意返回类型)

bua*_*bua 0 c++ templates metaprogramming

我想专注于以下模板:

template <typename T, int P>
T item(size_t s);
Run Code Online (Sandbox Code Playgroud)

这样的事情:

template<int P>
T item<typename T>(size_t s)
{
//for all numeric types
    return static_cast<T>(rand());
}

template <int P>
string item<string>(size_t s)
{
    return "asdf";
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*via 5

你不能部分专门化这样的功能模板.模板部分特化仅适用于类模板.

但是,您可以使用boost::enable_if"模拟"您正在寻找的功能模板部分特化.

// Specialization for std::string
//
template <int P, typename T>
T item(size_t, typename boost::enable_if<boost::is_same<T, std::string> >::type* = 0)
{
   ....
}

// Specialization for int
//
template <int P, typename T>
T item(size_t, typename boost::enable_if<boost::is_same<T, int> >::type* = 0)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

这样,如果你打电话,item<5, std::string>(10)你将调用第一个函数,如果你打电话,item<5, int>(10)你将调用第二个函数.

或者,如果您由于某种原因不想使用Boost,另一种解决方法是创建一个调度程序类模板,当然这可以是部分专用的.