c++ - 模板特化方法

标签 c++ templates sfinae

我有一个模板化的方法,我想添加一个专门化。对于一个函数,我会写

template<> T function<typename T>() { /* ... */ }

如何为方法执行此操作?

这是一个最小的失败示例,我需要专门研究 recv对于 <char> .

#include <vector>

class recver_t {
public:

    // recv should work for chars, ints, and lists of those.

    template <typename list_t, typename elem_t>
    list_t recv() {
        list_t list;
        for (int i = 0; i < 10; ++i) {
            list.push_back(recv<elem_t>());
        }
        return list;
    }

    // How to specify this template?
    // It needs to be a template taking 1 typename, but specialized for <char>
    // I need the template spec because I am overloading by return-type.
    char recv() {return '\0';}

    // likewise, but for int
    //int recv() {return 0;}
};

int main() {
    recver_t recver;
    // std::vector<char> result = recver.recv<std::vector, char>();
    // EDIT: should be this
    std::vector<char> result = recver.recv<std::vector<char>, char>();
}
  • 我可能会省略模板规范并依赖 C++ 的函数重载,但这不起作用,因为我是按返回类型重载的。

最佳答案

如果您只想进行特化,那么:

首先创建模板的主要定义:

template<typename T>
T recv();

然后只创建特化:

template<>
char recv<char>() {return '\0';}

// likewise, but for int
template<>
int recv<int>() {return 0;}

如果有人使用缺少专门化的模板,则链接器将显示有关缺少函数的错误消息。

因此您必须删除特定专业:

template<> 
float recv<float>() = delete;

或所有其他特化,但此定义必须替换主要定义:

template<typename T> 
T recv() = delete;

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

相关文章:

c++ - 传递指针地址

c++ - std::complex 的模板函数重载

c++ - CRTP (Curiously Recurring Template Pattern) 使用通用基模板类而不是派生类

c++ - 表达式 sfinae 中的惯用回退

c++ - 打印附加到 float 的%字符

c++ - 在 Visual C++ 上包含间接寻址

python - Boost::Python Extract -- 在 C++ 中访问 Python 字符串

c++ - "invalid use of non-static data member"当通过友善的输出运算符访问模板化类的字段时

c++ - SFINAE 只有在可能的情况下才有类(class)成员

c++ - SFINAE 构造函数