LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

Есть условно говоря, класс AstNode и его наследники, всякие там AdditionExpressionNode и прочая. И есть классы типа Evaluator, Printer и все такое.

Тоже требуется двойная диспетчеризация. Не пойму как тут в принципе лямбды помогут и каким боком.

Такие вещи в современных плюсах можно делать на базеstd::variantиstd::visitбез классов и наследования. Но с лямбдами, если используется трюк с overloaded:

std::visit(overloaded{
           [](auto arg) { std::cout << arg << ' '; },
           [](double arg) { std::cout << std::fixed << arg << ' '; },
           [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
       }, v);

Пока так, пока паттерн-матчинг еще не завезли.

Да, я тоже хотел подобную тему притащить. Она, правда, с наследованием не работает. Но для описанного случая наследование не нужно, потому что общий интерфейс можно опять же задать через концепты.

Исходная версия hateyoufeel, :

Есть условно говоря, класс AstNode и его наследники, всякие там AdditionExpressionNode и прочая. И есть классы типа Evaluator, Printer и все такое.

Тоже требуется двойная диспетчеризация. Не пойму как тут в принципе лямбды помогут и каким боком.

Такие вещи в современных плюсах можно делать на базеstd::variantиstd::visitбез классов и наследования. Но с лямбдами, если используется трюк с overloaded:

std::visit(overloaded{
           [](auto arg) { std::cout << arg << ' '; },
           [](double arg) { std::cout << std::fixed << arg << ' '; },
           [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; }
       }, v);

Пока так, пока паттерн-матчинг еще не завезли.

Да, я тоже хотел подобную тему притащить. Она, правда, с наследованием не работает.