Использование частичного класса шаблона в качестве специализированной функции шаблона

У меня есть шаблон, и я хочу специализировать его с помощью вектора (который сам является шаблоном). Это возможно?

Вот ошибка компилятора: ошибка 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)
{
    //...
}

person Antoine    schedule 27.03.2015    source источник
comment
Итак, я не могу специализировать свою шаблонную функцию с помощью частичного шаблонного класса?   -  person Antoine    schedule 27.03.2015
comment
Я беру это обратно. Вы не можете выполнять частичную специализацию шаблонов функций.   -  person R Sahu    schedule 27.03.2015


Ответы (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&.

person Yakk - Adam Nevraumont    schedule 27.03.2015