专门化具有泛型类的模板函数

时间:2012-03-14 15:23:40

标签: c++ template-specialization

我正在为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。有没有办法可以做到这一点?

2 个答案:

答案 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