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