ADL не ADL? Или как?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.01.24 19:42
Оценка:
Здравствуйте!

Есть у меня сериализация/десериализация 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
Маньяк Робокряк колесит по городу
Отредактировано 07.01.2024 19:50 Marty . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.