Получить значение из выражения сгиба «каскадных ifs»C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Получить значение из выражения сгиба «каскадных ifs»

Сообщение Anonymous »

Предположим, что я хочу создать свой собственный переключатель на основе лямбда со следующим синтаксисом:

Код: Выделить всё

auto s = make_switch(std::pair{0, []{ return 0;   }},
std::pair{1, []{ return 50;  }},
std::pair{2, []{ return 100; }});

assert( s(0) == 0   );
assert( s(1) == 50  );
assert( s(2) == 100 );
Я хотел бы использовать выражение сгиба, чтобы получить краткую реализацию, не требующую рекурсии. Идея состоит в том, чтобы сгенерировать нечто похожее на набор вложенных операторов if:

Код: Выделить всё

if(x == 0) return 0;
if(x == 1) return 50;
if(x == 2) return 100;
Я хотел бы написать следующее:

Код: Выделить всё

// pseudocode
template 
auto make_switch(Pairs... ps)
{
return [=](int x)
{
( if(ps.first == x) return ps.second(), ... );
};
}
Приведенный выше код не работает, как если бы (...){... не является выражением. Затем я попытался использовать оператор &&:

Код: Выделить всё

template 
auto make_switch(Pairs... ps)
{
return [=](int x)
{
return ((ps.first == x && ps.second()), ...);
};
}
Это компилируется, но возвращает результат ps.first == x && ps. Second(), который является логическим значением и не то значение int, которое мне нужно.

Мне нужен какой-нибудь оператор, представляющий собой комбинацию оператора-запятой и &&: он должен оценивать и оценивать правая часть оператора, если левая часть имеет значение true.

Я не могу придумать ни одного метода, который позволил бы мне реализовать это таким образом, чтобы я мог получать возвращаемое значение ps. Second() и распространять его. его вызывающей стороне лямбды, возвращаемой make_switch.

Можно ли реализовать такой вид «каскадных if» шаблон с выражением сгиба? Я бы хотел чтобы оценить только необходимое количество выражений, пока не будет найдена соответствующая ветвь.

Подробнее здесь: https://stackoverflow.com/questions/464 ... expression
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • EFCore: двойная ссылка на другую таблицу приводит к ошибке циклов или нескольких каскадных путей
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • EF Core — может вызывать циклы или несколько каскадных путей.
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Python выполняет операторы печати внутри ложных ifs
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Python выполняет операторы печати внутри ложных ifs
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Макрос для создания цепных цепей и IFS
    Anonymous » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»