模板专门化方法

时间:2018-09-26 17:46:11

标签: 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 ++的函数重载,但这将不起作用,因为我正在按return-type重载。

2 个答案:

答案 0 :(得分:2)

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

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

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;

答案 1 :(得分:-1)

您可以执行以下操作以拥有专门的广义方法:

char recv() {
    cout << "Specialized method" << endl;
    return '\0';
}

template <typename T>
T recv() {
    cout << "General method" << endl;
}

然后您可以这样称呼它:

recver.recv();
recver.recv<bool> ();

输出将是:

Specialized method
General method

但是这样,我认为您无法使用int专用方法,因为您不能重载函数的返回类型。