Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::experimental::conjunction

      From cppreference.com
      <cpp‎ |experimental
       
       
       
       
      Merged into ISO C++ The functionality described on this page was merged into the mainline ISO C++ standard as of 2/2016, seestd::conjunction(since C++17)
      template<class...B>
      struct conjunction;
      (library fundamentals TS v2)

      Forms thelogical conjunction of the type traitsB..., effectively performing a logical AND on the sequence of traits.

      The specializationstd::experimental::conjunction<B1, ..., BN> has a public and unambiguous base that is

      • ifsizeof...(B)==0,std::true_type; otherwise
      • the first typeBi inB1, ..., BN for whichbool(Bi::value)==false, orBN if there is no such type.

      The member names of the base class, other thanconjunction andoperator=, are not hidden and are unambiguously available inconjunction.

      Conjunction is short-circuiting: if there is a template type argumentBi withbool(Bi::value)==false, then instantiatingconjunction<B1, ..., BN>::value does not require the instantiation ofBj::value forj> i.

      Contents

      [edit]Template parameters

      B... - every template argumentBi for whichBi::value is instantiated must be usable as a base class and define membervalue that is convertible tobool

      [edit] Helper variable template

      template<class...B>
      constexprbool conjunction_v= conjunction<B...>::value;
      (library fundamentals TS v2)

      [edit]Possible implementation

      template<class...>struct conjunction:std::true_type{};template<class B1>struct conjunction<B1>: B1{};template<class B1,class...Bn>struct conjunction<B1, Bn...>:std::conditional_t<bool(B1::value), conjunction<Bn...>, B1>{};

      [edit]Notes

      A specialization ofconjunction does not necessarily inherit from eitherstd::true_type orstd::false_type: it simply inherits from the first B whose ::value, converted to bool, is false, or from the very last B when all of them convert to true. For example,conjunction<std::integral_constant<int,2>,std::integral_constant<int,4>>::value is4.

      [edit]Example

      Run this code
      #include <experimental/type_traits>#include <iostream> // func is enabled if all Ts... have the same typetemplate<typename T,typename...Ts>constexprstd::enable_if_t<std::experimental::conjunction_v<std::is_same<T, Ts>...>>func(T, Ts...){std::cout<<"All types are the same.\n";} template<typename T,typename...Ts>constexprstd::enable_if_t<!std::experimental::conjunction_v<std::is_same<T, Ts>...>>func(T, Ts...){std::cout<<"Types differ.\n";} int main(){    func(1,2'7, 3'1);        func(1,2.7,'3');}

      Output:

      All types are the same.Types differ.

      [edit]See also

      variadic logical AND metafunction
      (class template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/experimental/conjunction&oldid=154750"

      [8]ページ先頭

      ©2009-2026 Movatter.jp