Namespaces
Variants

std::experimental:: conjunction

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

Forme la conjonction logique des traits de type B... , effectuant ainsi un ET logique sur la séquence de traits.

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

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

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

La conjonction utilise l'évaluation court-circuit : s'il existe un argument de type template Bi pour lequel bool ( Bi :: value ) == false , alors l'instanciation de conjunction < 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 qui est convertible en bool

Modèle de variable d'assistance

template < class ... B >
constexpr bool conjunction_v = conjunction < B... > :: value ;
(spécifications techniques des bibliothèques fondamentales v2)

Implémentation possible

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> {};
*Note: Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seule la structure HTML a été conservée sans modification.*

Notes

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

Exemple

#include <experimental/type_traits>
#include <iostream>
// func est activée si tous les Ts... ont le même 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');    
}

Sortie :

All types are the same.
Types differ.

Voir aussi

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