Использование частичного шаблонного класса в качестве специализированной шаблонной функции
У меня есть шаблон, и я хочу специализировать его, используя вектор (который сам является шаблоном). Это возможно?
Вот ошибка компилятора: ошибка 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 ответ
Нет частичной специализации шаблонов функций.
Существует только полная специализация (что обычно является плохой идеей) и перегрузка.
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&
,