std::experimental::conjunction
| Definiert im Header <experimental/type_traits> |
||
| template< class... B > struct conjunction; |
(Library Fundamentals TS v2) | |
Bildet die logische Konjunktion der Typmerkmale B... und führt effektiv eine logische UND-Operation für die Sequenz von Merkmalen durch.
Die Spezialisierung std::experimental::conjunction<B1, ..., BN> hat eine öffentliche und eindeutige Basisklasse, die ist
- wenn sizeof...(B) == 0, std::true_type; ansonsten
- die erste Typ-
BiinB1, ..., BN, für die bool(Bi::value) == false gilt, oderBN, wenn kein solcher Typ existiert.
Die Mitgliedsnamen der Basisklasse, außer conjunction und operator=, sind nicht verborgen und sind in conjunction eindeutig verfügbar.
Die Konjunktion ist kurzschließend: Wenn es ein Template-Typ-Argument Bi mit bool(Bi::value) == false gibt, dann erfordert die Instanziierung von conjunction<B1, ..., BN>::value nicht die Instanziierung von Bj::value für j > i.
Inhalt |
[bearbeiten] Template-Parameter
| B... | - | Jedes Template-Argument Bi, für das Bi::value instanziiert wird, muss als Basisklasse verwendbar sein und ein Member value definieren, das in bool konvertierbar ist. |
[bearbeiten] Hilfsvariablen-Template
| template< class... B > constexpr bool conjunction_v = conjunction<B...>::value; |
(Library Fundamentals TS v2) | |
[bearbeiten] Mögliche Implementierung
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> {}; |
[bearbeiten] Hinweise
Eine Spezialisierung von conjunction erbt nicht notwendigerweise von entweder std::true_type oder std::false_type: Sie erbt von der ersten B, deren ::value, in bool konvertiert, falsch ist, oder von der allerletzten B, wenn alle zu wahr konvertiert werden. Zum Beispiel ist conjunction<std::integral_constant<int, 2>, std::integral_constant<int, 4>>::value 4.
[bearbeiten] Beispiel
#include <experimental/type_traits> #include <iostream> // func is enabled if all Ts... have the same type template<typename T, typename... Ts> constexpr std::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> constexpr std::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'); }
Ausgabe
All types are the same. Types differ.
[bearbeiten] Siehe auch
| (C++17) |
variadische logische AND-Metafunktion (Klassenvorlage) |