用泛型类专门化模板函数
Specializing a template function with a generic class
我正在编写一个简单的数据到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
。有什么办法我能做到这一点吗?
您的问题是希望提供一个作为模板本身的模板专用化。
解决问题的最简单方法是根本不使用模板专门化,而是依赖于函数重载。
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更专业,所以重载解析会在可能的地方选择这个函数)。
您可以重载serialize()
,例如:
#include <iostream>
#include <vector>
template <class T> void serialize(T *, char *)
{
std::cout << "Tn";
}
template <class T> void serialize(std::vector<T*> *, char *)
{
std::cout << "vectorn";
}
int main()
{
int a = 1;
std::vector<int*> x;
serialize(&a, 0);
serialize(&x, 0);
return 0;
}
输出:
T
vector
相关文章:
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 专门化模板覆盖函数/避免对象切片
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 如何在编译时专门化大型模板函数中的小部分
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 错误 C2893 无法专门化函数模板'unknown-type std::invoke(_Callable &&,_Types &&...)'
- 从 std 命名空间中专门化函数模板的想法有多糟糕?
- 为模板函数专门化一个模板类
- 基于参数值的c++模板成员函数专门化
- 如何确定函数专门化的主模板
- 等价参数的c++函数专门化
- 基于运行时值调用不同的模板函数专门化
- 跨库的模板函数专门化符号匹配
- 模板函数专门化,c++
- 如何使用type_traits或模板函数专门化来整合模板方法
- 如何在子类中重载模板化函数(专门化)
- 可变模板函数:专门化头/尾和空基准情况
- 不允许void的部分函数专门化-替代解决方案