Сообщение Re[2]: ADL не ADL? Или как? от 08.01.2024 2:59
Изменено 08.01.2024 3:09 Marty
Re[2]: ADL не ADL? Или как?
Здравствуйте, watchmaker, Вы писали:
M>>Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.
W>Но ты же сам пишешь:
M>>Она на внешнем генераторе
W>Это означает, что самое сложное препятствие уже устранено, и в генераторе достаточно буквально пару строк в коде поменять, чтобы закрыть namespace чуть раньше, чтобы специализация оказалось в том единственном namespace, к котором существует декларация шаблона
Остальное потом проосмыслю, но тут — сразу нет
Генератор берёт пачку определений enum на входе и открытие/закрытие NS вставляет в начало и конец сгенерённого файла. Внутри он не умеет прыгать по разным NS туда-сюда, это кучу кода генератора надо переделывать. Если enum'ы требуются в разные NS — это отдельные запуски генератора со своими отдельными определениями enum'ов и отдельным заданием namespace'ов
Грубо говоря, у генератора есть опция --namespace=my/name/space
В коде генератора есть что-то типа
Я пример сгенеренного приводил — https://github.com/al-martyn1/marty_cpp/blob/main/enums.h
M>>Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.
W>Но ты же сам пишешь:
M>>Она на внешнем генераторе
W>Это означает, что самое сложное препятствие уже устранено, и в генераторе достаточно буквально пару строк в коде поменять, чтобы закрыть namespace чуть раньше, чтобы специализация оказалось в том единственном namespace, к котором существует декларация шаблона
Остальное потом проосмыслю, но тут — сразу нет
Генератор берёт пачку определений enum на входе и открытие/закрытие NS вставляет в начало и конец сгенерённого файла. Внутри он не умеет прыгать по разным NS туда-сюда, это кучу кода генератора надо переделывать. Если enum'ы требуются в разные NS — это отдельные запуски генератора со своими отдельными определениями enum'ов и отдельным заданием namespace'ов
Грубо говоря, у генератора есть опция --namespace=my/name/space
В коде генератора есть что-то типа
{
auto nsGenGuard = NsGuard.parseOption(cmdLine, "namespace", std::cout);
// Тут генерится
// namespace my{
// namespace name{
// namespace space{
// Тут фигачим генерацию
// Тут скоп закончился, и выводится
// } // namespace space
// } // namespace name
// } // namespace my
}
Я пример сгенеренного приводил — https://github.com/al-martyn1/marty_cpp/blob/main/enums.h
Re[2]: ADL не ADL? Или как?
Здравствуйте, watchmaker, Вы писали:
M>>Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.
W>Но ты же сам пишешь:
M>>Она на внешнем генераторе
W>Это означает, что самое сложное препятствие уже устранено, и в генераторе достаточно буквально пару строк в коде поменять, чтобы закрыть namespace чуть раньше, чтобы специализация оказалось в том единственном namespace, к котором существует декларация шаблона
Остальное потом проосмыслю, но тут — сразу нет
Генератор берёт пачку определений enum на входе и открытие/закрытие NS вставляет в начало и конец сгенерённого файла. Внутри он не умеет прыгать по разным NS туда-сюда, это кучу кода генератора надо переделывать. Если enum'ы требуются в разные NS — это отдельные запуски генератора со своими отдельными определениями enum'ов и отдельным заданием namespace'ов
Грубо говоря, у генератора есть опция --namespace=my/name/space
В коде генератора есть что-то типа
Я пример сгенеренного приводил — https://github.com/al-martyn1/marty_cpp/blob/main/enums.h
Там правда только нет вложенных NS
Генератор сильно переписать не вариант, более реальный вариант поправить что-то в макросной консерватории, которую использует генератор
M>>Наивная идея была сделать общий шаблон enum_deserialize_throwable, и генерить специализации для него. Но потом я вспомнил, что все сгенерённые функции попадают в то же пространство имён, что и сам enum, и это могут быть любые NS, и точно не то NS, в котором объявлен шаблон, который я хотел специализировать.
W>Но ты же сам пишешь:
M>>Она на внешнем генераторе
W>Это означает, что самое сложное препятствие уже устранено, и в генераторе достаточно буквально пару строк в коде поменять, чтобы закрыть namespace чуть раньше, чтобы специализация оказалось в том единственном namespace, к котором существует декларация шаблона
Остальное потом проосмыслю, но тут — сразу нет
Генератор берёт пачку определений enum на входе и открытие/закрытие NS вставляет в начало и конец сгенерённого файла. Внутри он не умеет прыгать по разным NS туда-сюда, это кучу кода генератора надо переделывать. Если enum'ы требуются в разные NS — это отдельные запуски генератора со своими отдельными определениями enum'ов и отдельным заданием namespace'ов
Грубо говоря, у генератора есть опция --namespace=my/name/space
В коде генератора есть что-то типа
{
auto nsGenGuard = NsGuard.parseOption(cmdLine, "namespace", std::cout);
// Тут генерится
// namespace my{
// namespace name{
// namespace space{
// Тут фигачим генерацию
// Тут скоп закончился, и выводится
// } // namespace space
// } // namespace name
// } // namespace my
}
Я пример сгенеренного приводил — https://github.com/al-martyn1/marty_cpp/blob/main/enums.h
Там правда только нет вложенных NS
Генератор сильно переписать не вариант, более реальный вариант поправить что-то в макросной консерватории, которую использует генератор