Namespaces
Variants

std:: conjunction

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
conjunction
(C++17)
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Défini dans l'en-tête <type_traits>
template < class ... B >
struct conjunction ;
(depuis C++17)

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

La spécialisation std :: 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 est à court-circuit : s'il existe un argument de type template Bi avec bool ( Bi :: value ) == false , alors l'instanciation de conjunction < B1, ..., BN > :: value ne nécessite pas l'instanciation de Bj :: value pour j > i .

Si le programme ajoute des spécialisations pour std::conjunction ou std::conjunction_v , le comportement est indéfini.

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 conjunction_v = conjunction < B... > :: value ;
(depuis C++17)

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> {};

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 , explicitement convertie en bool , est false , ou du tout dernier B lorsque tous se convertissent en true . Par exemple, std :: conjunction < std:: integral_constant < int , 2 > , std:: integral_constant < int , 4 >> :: value vaut 4 .

L'instanciation en court-circuit différencie conjunction des expressions de repli : une expression de repli, comme ( ... && Bs :: value ) , instancie chaque B dans Bs , tandis que std :: conjunction_v < Bs... > arrête l'instanciation dès que la valeur peut être déterminée. Ceci est particulièrement utile si le type suivant est coûteux à instancier ou peut provoquer une erreur grave lorsqu'il est instancié avec un type incorrect.

Macro de test de fonctionnalité Valeur Norme Fonctionnalité
__cpp_lib_logical_traits 201510L (C++17) Traits de type d'opérateurs logiques

Exemple

#include <iostream>
#include <type_traits>
// func est activée si tous les Ts... ont le même type que T
template<typename T, typename... Ts>
std::enable_if_t<std::conjunction_v<std::is_same<T, Ts>...>>
func(T, Ts...)
{
    std::cout << "All types in pack are the same.\n";
}
// sinon
template<typename T, typename... Ts>
std::enable_if_t<!std::conjunction_v<std::is_same<T, Ts>...>>
func(T, Ts...)
{
    std::cout << "Not all types in pack are the same.\n";
}
template<typename T, typename... Ts>
constexpr bool all_types_are_same = std::conjunction_v<std::is_same<T, Ts>...>;
static_assert(all_types_are_same<int, int, int>);
static_assert(not all_types_are_same<int, int&, int>);
int main()
{
    func(1, 2, 3);
    func(1, 2, "hello!");
}

Sortie :

All types in pack are the same.
Not all types in pack are the same.

Voir aussi

(C++17)
métafonction logique NON
(modèle de classe)
métafonction logique OU variadique
(modèle de classe)