У меня есть набор статически определенных объектов, каждый из которых надо вызвать, до тех пор пока код возврата нормальный, и прекратить вызовы объектов, как только очередной код возврата не нормальный.

Допустим, объекты - лямбды. Вот, что у меня получилось:

#include <iostream>

template <class... Ts>
int Returns(Ts&&... args)
{
int i = 0;
int tmp;
(((tmp = args()) && (i = tmp)) || ...);
return i;
}

int main()
{
std::cout << Returns([](){return 0;}, [](){return 9;}, [](){return 0;}) << std::endl;
}

Это работает, но возможен ли другой, более компактный вариант без временной переменной и дополнительный шаблонов, вызывающих отдельно каждый из объектов или чего-то подобного вспомогательного, как обычно делается в старых плюсах?

Еще есть одна проблема, по крайней мере с GCC (-Wall) - компилятор показывает предупреждение:

main.cpp: In instantiation of 'int Returns(Ts&& ...) [with Ts = {main()::<lambda()>, main()::<lambda()>, main()::<lambda()>}]':

main.cpp:14:75: required from here

main.cpp:8:22: warning: suggest parentheses around '&&' within '||' [-Wparentheses]

8 | (((tmp = args()) && (i = tmp)) || ...);

| ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~

main.cpp:8:22: warning: suggest parentheses around '&&' within '||' [-Wparentheses]







 ,






URL записи