模板特化方法

Template specialize a method

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

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 '[=11=]';}

    // 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>();
}

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

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

template<typename T>
T recv();

然后只创建专业:

template<>
char recv<char>() {return '[=11=]';}

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

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

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

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

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

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