Получить значение из выражения сгиба «каскадных 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 МБ.

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