我有一个模板化的方法,我想添加一个专门化。对于一个函数,我会写
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/