template <class T>
struct option {
...
T m_val;
void SaveToFile( ostream& s)
{
Save( m_val, s );
}
};
Нужна сериализация в поток для каждого типа. Чтобы "магически" разруливалось компилятором, я решил использовать перегрузку.
Для стандартных типов достаточно простой шаблонной реализации
Вопрос в том как заставить компилятор использовать отдельную специализацию для енумов?
Я пытался использовать enable_if + is_enum, но у меня не получилось (enable_if методом дополнительного параметра — из-за этого не компилируются специализации).
Здравствуйте, RikkiTikkiTavi, Вы писали: RTT>Я пытался использовать enable_if + is_enum, но у меня не получилось (enable_if методом дополнительного параметра — из-за этого не компилируются специализации).
Оберни возвращаемое значение:
Этого недостаточно — для перечислений оно будет конфликтовать с общим шаблоном (который тоже подходит), так что его тоже надо защитить явно через disable_if.
P.S. Ессно, если ввести еще пару условий, то все превратится в кощмар, как справиться с ним, читать здесь: http://rsdn.ru/?forum/cpp/3722136
Здравствуйте, RikkiTikkiTavi, Вы писали:
RTT>А вот енумы я хочу сериализовывать в лонги, и при этом хочется написать одну функцию. Что-то типа:
Именно в лонги? Потому что если не придумывать специализацию под энум, а просто написать Save(my_enum_value, std::cout), то будет воплощён основной шаблон, внутри него std::cout<<my_enum_value, превратится в int или ближайший подходящий целый тип (unsigned, long, unsigned long, long long...) и нормально выведется.
Перекуём баги на фичи!
Re[3]: специализация шаблона для произвольного енума
Здравствуйте, jazzer, Вы писали: J>Этого недостаточно — для перечислений оно будет конфликтовать с общим шаблоном (который тоже подходит), так что его тоже надо защитить явно через disable_if.
Да, точно, забыл, у меня нет "общего шаблона".
J>P.S. Ессно, если ввести еще пару условий, то все превратится в кощмар, как справиться с ним, читать здесь: http://rsdn.ru/?forum/cpp/3722136
Ну, я такое решаю введением второго аргумента-стратегии, это позволяет спрятать "общий" шаблон вовнутрь и спокойно пользоваться перегрузкой и enable_if (общее поведение прячется под "..." или некий дамми-класс с шаблонным конструктором).
Здравствуйте, RikkiTikkiTavi, Вы писали:
RTT>Нужна сериализация в поток для каждого типа. Чтобы "магически" разруливалось компилятором, я решил использовать перегрузку.
не нужно ничего "изобретать", используй готовое
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)