Частичная специализация шаблонов функций отсутствует.
Есть только полная специализация (что обычно плохо) и перегрузка.
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