Можете ли да използвате различни шаблони на C++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
.