我正在为XML序列化程序编写一个简单的数据用于培训目的。我们的想法是将值传递给序列化函数,该函数将执行某些操作以将给定值转换为字符串格式。许多类型都有内置转换,但对于许多类型我希望有一个专门的功能来做到这一点。我的方法是:
我有一个带有此签名的模板函数:
template <class T> void serialize(T *value, Serializer *serializer);
我可以像这样专门化模板:
template <> void serialize<bool>(bool *value, Serializer *serializer);
工作正常。现在我想为向量编写一个序列化函数,如:
template <class T> void serialize<std::vector<T*> >(std::vector<T*> *value, Serializer *serializer) {
serializer->begin_section("array");
for(std::vector<T*>::iterator it = value->begin(); it != value->end(); it++) {
serializer->add_value(*it);
}
serializer->end_section();
}
但是当我编译它(g ++ 4.6.2)时,我得到了error: function template partial specialization ‘serialize<std::vector<T*> >’ is not allowed
。有没有办法可以做到这一点?
答案 0 :(得分:2)
您的问题是您希望提供模板本身的模板专业化。
解决问题的最简单方法是根本不使用模板特化,而是依赖函数重载。
template<class T> void serialize(T *value, Serializer *serializer);
仍然可以提供默认实现,但是如果是更专业的版本,如
void serialize(bool *value, Serializer *serializer);
存在,过载解析将优先考虑。 这允许您简单地定义像
这样的函数template <typename T> void serialize(::std::vector<T> *value, Serializer *serializer);
将为矢量调用。 (考虑到:: std :: vector比T更专业,所以重载决策会尽可能选择这个函数。)
答案 1 :(得分:1)
您可以重载serialize()
,for example:
#include <iostream>
#include <vector>
template <class T> void serialize(T *, char *)
{
std::cout << "T\n";
}
template <class T> void serialize(std::vector<T*> *, char *)
{
std::cout << "vector\n";
}
int main()
{
int a = 1;
std::vector<int*> x;
serialize(&a, 0);
serialize(&x, 0);
return 0;
}
输出:
T
vector