R>int func(MyVariant v)
R>{
R> return std::visit([]<typename T>(const T& t) {
R> if constexpr (std::same_as<T, A>)
R> {
R> doSomething(t);
R> }
R> else if constexpr (std::same_as<T, B> or std::same_as<T, C>)
R> {
R> std::cout << "Error: B or C not allowed here\n";
R> return -1;
R> }
R> return 0; // OK
R> }, v);
R>}
R>
в ветке doSomething(t); я не хочу выходить из func. Надо было там написать после if продолжение кода — //.... Поправлю для остальных
R>И это не единственный, и не лучший, кстати, вариант использования — тут на перегрузках можно реально по красоте всё сделать.
R>И я привёл законченный работающий пример, а тебе ещё нужно наколбасить энумов к своим вариантам. В итоге нифига не проще будет, а будет реально куча.
Генератор
А можно в рантайме, в какой-нибудь другой подсистеме, сформировать список альтернатив, которые нужно обработать, и передать в обработчик вместе с variant'ом?
Здравствуйте, rg45, Вы писали:
M>>у нас намечается простыня
R>Так это только благодаря тебе она начинается, потому что ты if-ы используешь. А так-то вообще такие штуки на перегрузках делаются. И перегрузки можно делать по-разному. Можно, лямбды использовать, можно собственные функционалы. Можно через композицию, можно через монолиты. И здесь очень востребованы оказываются концепцы и констрейнты. И код реально выглядит красиво и профессионально, не что что твои if-ы, с энумами.
Нет под рукой ссылки, где можно почитать такой прекрасный код?
О, шаблонная лямбда? Не встречал такого. Через жопу писал (auto a) и затем тип выводил через declspec/decay
M>>в ветке doSomething(t); я не хочу выходить из func. Надо было там написать после if продолжение кода — //.... Поправлю для остальных
R>Так просто убери else после if-а и пиши, что хочешь. Я же опирался на твой прототип.
Ну, может ты и прав.
А где бы всё же полюбоваться на божественный код с variant'ами? Для общего развития?
И как списки альтернатив передавать между подсистемами в рантайме?
Рабочие примеры, я уже задолбался писать, честно говоря. Но поверь, для того, чтобы добиться такого, требуется всего пол экрана вспомогательного повторно используемого кода.
--
Справедливость выше закона. А человечность выше справедливости.
на плюсах, разбираю сишечную метадату через CastXML. В принципе, уже сделал на говне, решил разобраться, как можно было бы сделать лучше. И да, мои if/else/switch для поддержки были бы гораздо проще кому-то из команды кроме меня.
ЗЫ А в частном порядке нельзя с тобой связаться, если ты не против? А то код проекта не могу показывать на публику, но в частном порядке думаю можно. А ты бы мог без труда найти дерьмовые решения, и показать на форуме только их, чтобы всем было полезно. Наверное, нахрен тебе не надо
Здравствуйте, Marty, Вы писали:
M>ЗЫ А в частном порядке нельзя с тобой связаться, если ты не против? А то код проекта не могу показывать на публику, но в частном порядке думаю можно. А ты бы мог без труда найти дерьмовые решения, и показать на форуме только их, чтобы всем было полезно. M>Наверное, нахрен тебе не надо
Можно. Только не сегодня, ладно?
Я сделаю все необходимые вспомогательные утилиты (благо их не так уж много), а ты придумай какой-нибудь синтетический, не очень сложный, но более-менее осмысленный пример, на котором можно будет обкатать. И выкладывай пример прямо сюда. Я на днях по свободке запилю.
--
Справедливость выше закона. А человечность выше справедливости.
Да выброси ты свои kind-ы, это вчерашний день. Ты ж пойми, эти кайнды тебе нужны только для того, чтобы сделать диспетченизацию и полиморфизм. Больше ни зачем.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
M>>Как мне такое сделать?
R>Да выброси ты свои kind-ы, это вчерашний день. Ты ж пойми, эти кайнды тебе нужны только для того, чтобы сделать диспетченизацию и полиморфизм. Больше ни зачем.
В целом, я понимаю, но современный сипипи много шума даёт, пытаюсь найти вариант, который бы использовал современный язык, но был бы прост для поддержки
Простите, а вот этот вот список {Kind::A, Kind::B, ...} -- он откуда возьмется?
Его программист должен ручками написать? Типа "я помню, что в структуре A есть атрибут name, поэтому Kind::A нужно включить в этот список". Правильно?
M>>Ну или как-то так
S>Простите, а вот этот вот список {Kind::A, Kind::B, ...} -- он откуда возьмется? S>Его программист должен ручками написать? Типа "я помню, что в структуре A есть атрибут name, поэтому Kind::A нужно включить в этот список". Правильно?
Типа того. Но в моей задаче я разбирал XML, можно было оттуда выцепить и сгенерить код
Здравствуйте, Marty, Вы писали:
S>>Простите, а вот этот вот список {Kind::A, Kind::B, ...} -- он откуда возьмется? S>>Его программист должен ручками написать? Типа "я помню, что в структуре A есть атрибут name, поэтому Kind::A нужно включить в этот список". Правильно?
M>Типа того. Но в моей задаче я разбирал XML, можно было оттуда выцепить и сгенерить код
Ну так говно же.
Современный C++ позволяет сделать это проще. Выше тов.YuriV уже показал набросок.