std::experi...conjunction(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

Welcome to the std::experi...conjunction(3) page from the C++ Standard Libary β€” yes bestie, that spelling is in the source, I'm not fixing it πŸ’….

std::experimental::conjunction β€” std::experimental::conjunction.


🌸 SYNOPSIS 🌸

Defined in header <experimental/type_traits>:

template< class... B >                        (library fundamentals TS v2)
struct conjunction;

Okay so this forms the logical conjunction of the type traits B..., effectively performing a logical AND on the sequence of traits. No cap.

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

  • if sizeof...(B) == 0, std::true_type; otherwise
  • the first type Bi in B1, ..., BN for which bool(Bi::value) == false, or BN if there is no such type.

The member names of the base class, other than conjunction and operator=, are not hidden and are unambiguously available in conjunction.

Conjunction is short-circuiting: if there is a template type argument Bi with bool(Bi::value) == false, then instantiating conjunction<B1, ..., BN>::value does not require the instantiation of Bj::value for j > i.


πŸŽ€ TEMPLATE PARAMETERS πŸŽ€

  • B... β€” every template argument Bi for which Bi::value is instantiated must be usable as a base class and define member value that is convertible to bool.

πŸ¦‹ HELPER VARIABLE TEMPLATE πŸ¦‹

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

πŸ”₯ 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> {};

πŸ’œ NOTES πŸ’œ

A specialization of conjunction does not necessarily inherit from either std::true_type or std::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 is 4. Wild, right? 😭


🌈 EXAMPLE 🌈

        // Run this code

        #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');
        }

⭐ OUTPUT ⭐

All types are the same.
Types differ.

πŸ‘‘ SEE ALSO πŸ‘‘

  • conjunction β€” variadic logical AND metafunction, (C++17) (class template).

okay that's the whole page, bestie 🫢 β€” source/version/date: http://cppreference.com Β· 2024.06.10 Β· std::experi...conjunction(3). slay and bye ✨

πŸ“¦ where this page comes from