c++ - 函数模板特化与模板

标签 c++ templates typetraits

我有一个函数模板,其中包含各种类型的特化。但是,我想为指针定义一个模板特化。

为了澄清,这是现有代码的一部分:

template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
    //...
}
template<> inline std::string Get(int index) {
    //...
}

现在我计划添加一个特化,当 T 是一个指向类的指针时执行。我试图添加以下几行,但是这个(可以说是不完整的)变体似乎没有被接受为第一个未定义模板的专门化。 (调用不明确);其他类型特征安排也没有以成功的编译结束。

template<typename T>
typename std::enable_if<std::is_pointer<T>::value, T>::type
inline Get(int index) {
    //...
}

我在这里有什么选择?

最佳答案

您不能部分特化函数模板,而您的尝试实际上创建了一个不同的重载模板。没有所有 SFINAE 噪音的最干净的方法是将它包装在一个类模板中,您可以部分特化,然后编写一个函数模板,该模板分派(dispatch)到适当的类模板特化:

template <class T>
struct do_get;

template <>
struct do_get<bool> {
    static bool get(int i) { /*...*/ }
};

template <class T>
struct do_get<T*> {
    static T* get(int i) { /*...*/ }
};

template <class T>
T Get(int i) { return do_get<T>::get(i); }

Demo .

T 是一个指针时,另一种方法是使用 enable_if 显式禁用未定义​​的基本模板,但如果您想添加额外的重载,这很快就会变得不堪重负。

关于c++ - 函数模板特化与模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25440000/

相关文章:

c++ - 在 C++ 和 C 中共享一个结构?

c++ - boost :为什么 write_json 改变内容

templates - StarUML 类图 : How to manually add Generics (Template Type T) for a class

javascript - 基于 DOM 树的 JavaScript 模板引擎

c++ - 输入特征以检查类是否具有成员函数

c++ - 在模板中,如果从属名称是函数,则调用它

c++ - 常量字符数组的获取字符串长度函数(strlen)不是常量表达式

ruby - 在哪里可以找到 Rails API rdoc 模板

c++ - 声明模板成员函数返回类型

c++ - 如何更改 libwx_gtk2ud_richtext-2.8 的名称