模板特化方法
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>();
}
- 我可能会省略模板规范并依赖 C++ 的函数重载,但这不会起作用,因为我正在按 return 类型重载。
如果您只想进行专业化,那么:
首先创建模板的主要定义:
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;
我有一个模板化的方法,我想添加一个专业化。对于函数,我会写
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>();
}
- 我可能会省略模板规范并依赖 C++ 的函数重载,但这不会起作用,因为我正在按 return 类型重载。
如果您只想进行专业化,那么:
首先创建模板的主要定义:
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;