При экспериментировании с вариативными шаблонами я подошел к точке, где было бы полезно сделать некоторое уменьшение значений признаков до одного конечного значения с помощью некоторой операции. Вариант использования для меня:Как уменьшить значения значений параметра вариационного шаблона до одного значения?
constexpr bool and(bool lhs, bool rhs){return lhs && rhs;}
struct Foo
{
template<
typename ...Ts>
Foo(
Ts&&... args)
noexcept(TraitReduction<std::is_nothrow_move_constructible, and, Ts...>::value)
{/*...*/}
}
Проблема заключается в том, что в свойствах STL заданы только один шаблон. Мой текущий рабочий раствор:
template<
template<typename> class TraitT,
bool (*Operator)(bool,bool),
typename T1,
typename ...Ts>
struct TraitReduction
{
static bool const value = TraitT<T1>::value;
};
template<
template<typename> class TraitT,
bool (*Operator)(bool,bool),
typename T1,
typename T2,
typename ...Ts>
struct TraitReduction<
TraitT,
Operator,
T1,
T2,
Ts...>
{
static bool const value = (*Operator)(
TraitT<T1>::value,
TraitReduction<TraitT, Operator, T2, Ts...>::value);
};
Мой вопрос, если STL дает некоторые стандартизированные (вероятно, более удобно) solutionfor эту задачу? И, конечно, я был бы рад получить некоторые комментарии к моему текущему решению, что плохо или что может быть лучше.
'noexcept ((is_nothrow_move_constructible {} и ...)) ' –
0x499602D2
Этот конкретный случай выглядит как работа для [' std :: conj'] (http://en.cppreference.com/w/cpp/types/conjunction), но если вы ищете более обобщенный подход, то это недостаточно – krzaq
Вы знаете, что 'и' это другое написание '&&', правильно? –