Namespaces
Variants

std::experimental:: disjunction

From cppreference.net
Défini dans l'en-tête <experimental/type_traits>
template < class ... B >
struct disjunction ;
(bibliothèque fundamentals TS v2)

Forme la disjonction logique des traits de type B... , effectuant effectivement un ou logique sur la séquence de traits.

La spécialisation std :: experimental :: disjunction < B1, ..., BN > possède une base publique et non ambiguë qui est

  • si sizeof... ( B ) == 0 , std:: false_type ; sinon
  • le premier type Bi dans B1, ..., BN pour lequel bool ( Bi :: value ) == true , ou BN s'il n'existe pas un tel type.

Les noms des membres de la classe de base, à l'exception de disjunction et operator= , ne sont pas masqués et sont disponibles sans ambiguïté dans disjunction .

La disjonction est à court-circuit : s'il existe un argument de type template Bi avec bool ( Bi :: value ) ! = false , alors l'instanciation de disjunction < B1, ..., BN > :: value ne nécessite pas l'instanciation de Bj :: value pour j > i .

Table des matières

Paramètres du modèle

B... - chaque argument de template Bi pour lequel Bi :: value est instancié doit être utilisable comme classe de base et définir le membre value convertible en bool

Modèle de variable d'assistance

template < class ... B >
constexpr bool disjunction_v = disjunction < B... > :: value ;
(bibliothèque fondamentale TS v2)

Implémentation possible

template<class...> struct disjunction : std::false_type {};
template<class B1> struct disjunction<B1> : B1 {};
template<class B1, class... Bn>
struct disjunction<B1, Bn...> 
    : std::conditional_t<bool(B1::value), B1, disjunction<Bn...>>  {};
*Note: Le code C++ dans les balises `
` n'a pas été traduit conformément aux instructions, car il contient des termes spécifiques au C++ qui doivent rester en anglais pour préserver leur signification technique.*

Notes

Une spécialisation de disjunction n'hérite pas nécessairement de std:: true_type ou de std:: false_type : elle hérite simplement du premier B dont la ::value , convertie explicitement en bool , est vraie, ou du tout dernier B lorsque tous se convertissent en faux. Par exemple, disjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value vaut 2 .

Exemple

Voir aussi

métafonction OU logique variadique
(modèle de classe)