【发布时间】:2017-09-20 14:43:25
【问题描述】:
我想为模板函数编写一个特化,其中特化的类型本身就是一个模板化类型。 (我使用的是 C++11 或更高版本。)
在下面的示例代码中,我有通用函数convertTo 和int 的工作特化,允许我使用convertTo<int>(s)(如图所示)。但我不知道如何为 std::set<T> 编写专业化。这是我尝试过的:
#include <string>
#include <sstream>
#include <set>
#include <unordered_set>
using namespace std;
// generic version
template<class T> T convertTo(const char* str) {
T output;
stringstream ss(str, stringstream::in);
ss >> output;
return output;
}
// specialization for int. works.
template <>
int convertTo<int>(const char* str) {
return atoi(str);
}
template <>
template<class T> set<T> convertTo<set<T>>(const char* str) {
set<T> S;
// TODO split str by comma, convertTo<T>(each element) and put into S
return S;
}
template <>
template<class T> unordered_set<T> convertTo<unordered_set<T>>(const char* str) {
unordered_set<T> S;
// TODO split str by comma, convertTo<T>(each element) and put into S
return S;
}
int main() {
float f = convertTo<float>("3.141");
int i = convertTo<int>("123");
set<int> os = convertTo<set<int>>("9,8,7,6");
unordered_set<int> os = convertTo<unordered_set<int>>("9,8,7,6");
return 0;
}
使用 g++ 6.3.0 我收到错误消息:
too many template parameter lists in declaration of ‘std::set<T> convertTo(const char*)’
所以我尝试注释掉尝试的专业化上方的template<> 行,但后来我得到:
non-class, non-variable partial specialization ‘convertTo<std::set<T, std::less<_Key>, std::allocator<_CharT> > >’ is not allowed
我不明白。我不打算写部分专业化?
我不想使用template<class Container>,因为我希望能够为不同的容器类编写特定的代码。 (我的代码中的其他模板类需要这个。)
有什么建议吗?
【问题讨论】:
-
函数模板不能部分特化。而是重载。
-
“我不打算专门化” - 然而你使用了专门化语法
convertTo<set<T>> -
这肯定是骗人的,SO 上有数百万个部分专业化的函数模板。
-
我确实打算专门化,但据我了解,“部分模板专门化”意味着只修复一些模板参数,而将其他模板化。所以,我想我想写一个完整的专业? @n.m.:我认为这就是我通过删除
template<>所尝试的。 -
@lawilog 虽然还没有完全修复,
set<T>仍然有一个免费参数。部分专业化不仅是固定一个模板参数,同时保留第二个模板参数。您可以只使用一个模板参数来部分特化一个结构;如果您有T的主要定义和set<T>的次要定义,则第二个定义仍然是模板(因此,不是完全专业化的),但在某些情况下它比主要定义更专业。因此,部分专业化。
标签: c++ c++11 templates specialization