У меня есть набор статически определенных объектов, каждый из которых надо вызвать, до тех пор пока код возврата нормальный, и прекратить вызовы объектов, как только очередной код возврата не нормальный.
Допустим, объекты - лямбды. Вот, что у меня получилось:
#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]