Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用泛型类专门化模板函数_C++_Template Specialization - Fatal编程技术网

C++ 用泛型类专门化模板函数

C++ 用泛型类专门化模板函数,c++,template-specialization,C++,Template Specialization,为了便于培训,我正在编写一个简单的数据到XML序列化程序。其思想是将值传递给序列化函数,该函数将把给定的值转换为字符串格式。许多类型都有内置转换,但对于许多类型,我希望有一个专门的函数来实现这一点。我的做法是: 我有一个带有此签名的模板函数: template <class T> void serialize(T *value, Serializer *serializer); 模板无效序列化(T*值,序列化器*序列化器); 我可以像这样专门化模板: template <&

为了便于培训,我正在编写一个简单的数据到XML序列化程序。其思想是将值传递给序列化函数,该函数将把给定的值转换为字符串格式。许多类型都有内置转换,但对于许多类型,我希望有一个专门的函数来实现这一点。我的做法是:

我有一个带有此签名的模板函数:

template <class T> void serialize(T *value, Serializer *serializer);
模板无效序列化(T*值,序列化器*序列化器);
我可以像这样专门化模板:

template <> void serialize<bool>(bool *value, Serializer *serializer);
模板void serialize(bool*值,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();
}
模板无效序列化(std::vector*值,序列化程序*序列化程序){
序列化程序->开始部分(“数组”);
对于(std::vector::iterator it=value->begin();it!=value->end();it++){
序列化程序->添加_值(*它);
}
序列化程序->结束_节();
}

但是当我编译它(g++4.6.2)时,我得到了
错误:函数模板部分专门化“serialize”是不允许的
。有什么方法可以做到这一点吗?

您的问题是希望提供一个模板专用化,即模板本身

解决问题的最简单方法是根本不使用模板专门化,而是依赖函数重载

template<class T> void serialize(T *value, Serializer *serializer);
如果存在,则重载解决方案将首选它。 这允许您简单地定义一个函数,如

template <typename T> void serialize(::std::vector<T> *value, Serializer *serializer);
模板无效序列化(::std::vector*值,序列化程序*序列化程序);

这将被称为向量。(考虑::std::vector比T更专业化,因此重载解析将在可能的情况下选择此函数)。

您可以重载
serialize()
,:

template <typename T> void serialize(::std::vector<T> *value, Serializer *serializer);
#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