Можете ли вы использовать вариативные шаблоны С++ 11 для завершения /* ??? */
в:
template<bool...v> struct var_and { static bool constexpr value = /* ??? */; };
чтобы var_and<v...>::value
предоставлял &&
вместо логического пакета v
во время компиляции?
Можете ли вы сделать то же самое для struct var_or<v...>
для ||
?
Можете ли вы использовать оценку короткого замыкания (в обоих случаях)?
Изменить: обновление принятого ответа добавило, что C++17 свернуть выражения включить
template<bool... v> constexpr bool var_and = (v && ...);
template<bool... v> constexpr bool var_or = (v || ...);
Кажется, что для подходов, основанных на наборе параметров, возможен только ограниченный тип «краткой оценки»: хотя создание экземпляра var_or<true,foo(),bar()>
вызывает ||
только один раз, он также вызывает как foo
, так и bar
.