c++ - 如何专门化此模板(注意返回类型)

标签 c++ templates metaprogramming

我想专注于以下模板:

template <typename T, int P>
T item(size_t s);

变成这样的东西:

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

最佳答案

您不能像那样部分特化函数模板。模板偏特化仅适用于类模板。

但是,您可以使用 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)
{
    ....
}

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

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

关于c++ - 如何专门化此模板(注意返回类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665231/

相关文章:

c++ - xcode 保存的编译器标志在哪个文件中?

c++ - 使用C++模板编程提取任意结构的字段类型

c++ - 使用指向抽象基类的指针时,是否有更有效的方法来获取派生类的类型?

c++ - 我需要帮助为这个 vector 类制作一个插入函数

c++ - 如何重载模板函数以匹配特定容器?

c++ - 有没有统一函数类型限定符,简化可恶的函数类型的建议?

c++ - 区分两个包扩展

ruby - 将字符串作为表达式求值

c++ - 元编程继承限制

c++ - SDL2 无法创建窗口,因为找不到匹配的 GLX 视觉对象