50 template<
typename... Ts>
61 template<
typename VariantT,
typename U, std::size_t... I>
64 return ((std::is_same_v<
65 std::remove_cvref_t<U>,
66 std::remove_cvref_t<std::variant_alternative_t<I, VariantT>>
75 template<
typename VariantT,
typename U>
77 variant_has_type_impl<VariantT, U>(
78 std::make_index_sequence<std::variant_size_v<VariantT>>()
101 requires {
typename T::value_type; } &&
102 std::same_as<T, std::optional<typename T::value_type>>;
132 concept Variant = Detail::is_variant_v<std::remove_cvref_t<T>>;
145 template<
typename T,
typename U>
148 Detail::variant_has_type_v<std::remove_cvref_t<T>, U>;
Exactly std::optional<U> for some U.
Definition wrappers.hxx:100
Type with accessible first and second members.
Definition wrappers.hxx:117
Variant T that lists U among its alternatives.
Definition wrappers.hxx:146
Instantiation of std::variant, after stripping cv/ref.
Definition wrappers.hxx:132
constexpr bool variant_has_type_impl(std::index_sequence< I... > seq) noexcept
Fold: is cv/ref-stripped U one of VariantT's alternatives?
Definition wrappers.hxx:62
constexpr bool variant_has_type_v
Convenience wrapper around variant_has_type_impl.
Definition wrappers.hxx:76
constexpr bool is_variant_v
true when T is exactly std::variant<Ts...> after cv/ref strip.
Definition wrappers.hxx:44
Root namespace of the StormByte suite.