如果变体类型之一,如何启用模板功能?

Nes*_*tor 2 c++ variant type-traits template-meta-programming c++17

我的原型有一些变体using V = std::variant<A, B, C>和功能。foovoid foo(const T&)

并希望我的函数在传递的类型之一时foo进行std::enable_if编辑V(而无需明确指示它们)。

V将及时得到越来越多的类型,因此

template<class T,
         typename std::enable_if<
            std::is_same_v<T, A> || std::is_same_v<T, B> || std::is_same_v<T, C>,
            int>::type = 0>
void foo(const T&);
Run Code Online (Sandbox Code Playgroud)

是不能接受的。

是一个增强的解决方案。

是否可以实现的逻辑std::variant

理想情况下,类型特征应看起来像is_one_of_variants_types<V, T>

Pio*_*cki 5

template <typename, typename>
constexpr bool is_one_of_variants_types = false;

template <typename... Ts, typename T>
constexpr bool is_one_of_variants_types<std::variant<Ts...>, T>
    = (std::is_same_v<T, Ts> || ...);

template <typename T>
auto foo(const T&)
    -> std::enable_if_t<is_one_of_variants_types<V, T>>;
Run Code Online (Sandbox Code Playgroud)

演示