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

Using a partial template class as a specialized template function

本文关键字:专用 函数 用部      更新时间:2023-10-16

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

以下是编译器错误:错误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)
{
    //...
}

函数模板没有部分专门化。

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

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&