Здравствуйте!
Есть у меня сериализация/десериализация enum'ов.
Она на внешнем генераторе, в результате его работы в том же пространстве имён, в котором объявлен enum, появляется функция:
inline
EnumType enum_deserialize(const std::string &str, EnumType defVal);
Обычно у меня есть EnumType::invalidValue, я его передаю как defVal, и если на выходе получил EnumType::invalidValue, то кидаю исключение.
Поиск реализации идёт через ADL по дефолтному значению, и всё в общем-то работает.
Есть ещё функция
inline
EnumType enum_deserialize_##EnumType(const std::string &str);
Она сама умеет кидать исключение, но её имя генерится на макросах и зависит от имени enum'а.
Теперь я хочу сделать шаблонную функцию enum_deserialize, чтобы тип enum'а она получала как параметр шаблона.
Пока я сделал, основываясь на том, что EnumType::invalidValue у меня всегда -1, и я использую первую версию, передаю туда инвалида (-1), и на выходе с этим инвалидом сравниваю, и кидаю исключение, если что-то пошло не так.
Но это завязано на мои соглашения, что EnumType::invalidValue у меня всегда -1. С enum'ами, константы для которых могут зависеть от внешних спек, такое может не прокатить.
Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.
Как быть?
ЗЫ Генератор генерит кот через эти матросики —
https://github.com/al-martyn1/marty_cpp/blob/main/marty_enum.h
Пример сгенерённого кода —
https://github.com/al-martyn1/marty_cpp/blob/main/enums.h