Информация об изменениях

Сообщение 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
В коде генератора есть что-то типа
{
    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
В коде генератора есть что-то типа
{
    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

Генератор сильно переписать не вариант, более реальный вариант поправить что-то в макросной консерватории, которую использует генератор