我有一个模板,我想使用矢量(它本身就是模板)来专门化它。有可能吗?
这是编译器错误: 错误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)
{
//...
}
答案 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&
。