我有一个模板化的方法,我想添加一个专业化。对于功能,我会写
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>();
}
答案 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专用方法,因为您不能重载函数的返回类型。