使用部分模板 class 作为专门的模板函数

Using a partial template class as a specialized template function

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

这是编译器错误: 错误 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 重载粘贴到要更改其行为的 class 的命名空间中。


如果您真的非常需要部分专业化,请将您的工作转入模板 class,然后对该模板进行部分专业化 class。

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&.