title: How to reduce Trait-values of variadic template parameter to one value?
body: <p>While experimenting with variadic templates I came to a point where it would be useful to make kind of reduction of trait values to one final value via some operation. The use-case for me is:  </p>
  
  <pre><code>constexpr bool and(bool lhs, bool rhs){return lhs &amp;&amp; rhs;}
  
  struct Foo
  {
      template&lt;
          typename ...Ts&gt;
      Foo(
          Ts&amp;&amp;... args)
              noexcept(TraitReduction&lt;std::is_nothrow_move_constructible, and, Ts...&gt;::value)
      {/*...*/}
  }
  </code></pre>
  
  <p>The problem is that the STL traits are all single template typed.
  My current working solution is:</p>
  
  <pre><code>template&lt;
      template&lt;typename&gt; class TraitT,
      bool (*Operator)(bool,bool),
      typename T1,
      typename ...Ts&gt;
  struct TraitReduction
  {
      static bool const value = TraitT&lt;T1&gt;::value;
  };
  
  template&lt;
      template&lt;typename&gt; class TraitT,
      bool (*Operator)(bool,bool),
      typename T1,
      typename T2,
      typename ...Ts&gt;
  struct TraitReduction&lt;
      TraitT,
      Operator,
      T1,
      T2,
      Ts...&gt;
  {
      static bool const value = (*Operator)(
          TraitT&lt;T1&gt;::value,
          TraitReduction&lt;TraitT, Operator, T2, Ts...&gt;::value);
  };
  </code></pre>
  
  <p>My question is if the STL gives some standardized (probably more convenient) solutionfor that task? And of course I would be happy to here some comments on my current solution, what is bad or what could be better.</p>