utils/variant_element: simplify is_variant_element with right fold

for better readability than the recursive approach.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>

Closes #12091
This commit is contained in:
Kefu Chai
2022-11-27 11:36:47 +08:00
committed by Avi Kivity
parent 78222ea171
commit af011aaba1

View File

@@ -14,19 +14,11 @@
namespace utils {
// Given type T and an std::variant Variant, return std::true_type if T is a variant element
// This is also the recursion base case (empty variant), so return false.
template <typename T, typename Variant>
struct is_variant_element : std::false_type {
};
template <class T, class Variant>
struct is_variant_element;
// Match - return true
template <typename T, typename... Elements>
struct is_variant_element<T, std::variant<T, Elements...>> : std::true_type {
};
// No match - recurse
template <typename T, typename U, typename... Elements>
struct is_variant_element<T, std::variant<U, Elements...>> : is_variant_element<T, std::variant<Elements...>> {
template <class T, class... Elements>
struct is_variant_element<T, std::variant<Elements...>> : std::bool_constant<(std::is_same_v<T, Elements> || ...)> {
};
// Givent type T and std::variant, true if T is one of the variant elements.