使用部分模板类作为专用模板函数

时间:2015-03-27 17:02:30

标签: c++ templates syntax template-specialization specialization

我有一个模板,我想使用矢量(它本身就是模板)来专门化它。有可能吗?

这是编译器错误: 错误C2768:'serialize':非法使用显式模板参数。

我需要做的一个小例子:

template<typename T>
void serialize(T data, Stream& stream)
{
    //...
}

template<typename MT>
void serialize<map<string, MT>>(map<string, MT> data, Stream& stream)
{
    //...
}

1 个答案:

答案 0 :(得分:1)

功能模板没有部分专业化。

只有完全专业化(这通常是一个坏主意)和重载。

template<typename MT>
void serialize(map<string, MT> data, Stream& stream)
{
  //...
}

会过载。如果你总是允许类型推导发生,它可能会像你期望的专业化一样工作。

std的命名空间中粘贴您要支持的任何serialize命名空间。在要更改行为的类的名称空间中粘贴其他serialize重载。


如果您确实需要部分专业化,请将您的工作转发到模板类,并对该类进行部分专业化。

template<class T>
struct serialize_impl {
  void operator()(T data, Stream& stream) const {
    // ...
  }
};
template<class MT>
struct serialize_impl<map<string, MT>> {
  void operator()(map<string MT> data, Stream& stream) const {
    // ...
  }
};

然后

template<class T>
void serialize(T data, Stream& stream) {
  serialize_impl<T>{}(data, stream);
}
然而,这通常是一个坏主意,而且重载通常是正确的做法。

此外,在序列化时不要按价值计算。然后按T const&