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

How to make a template function enabled if one of variant's types?

我有一些变体 using V = std::variant<A, B, C> 和一些带有原型 void foo(const T&) 的函数 foo

并且希望我的函数 fooV 的一种类型被传递时被 std::enable_if 编辑(没有明确指出它们)。

我的 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&);

不可接受。

是一个提升解决方案。

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

理想情况下,类型特征应类似于 is_one_of_variants_types<V, T>

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

DEMO

And want my function foo to be std::enable_if ed if one of V's types are passed (without indicating them explicitly).

我想你可以简单地尝试,在 decltype() 中,在 V 值中 emplace() 一个 T 值。

我的意思是...如下

#include <variant>
#include <type_traits>

struct A {};
struct B {};
struct C {};

using V = std::variant<A, B, C>;

template <typename T>
auto foo (T const & t)
   -> std::void_t<decltype( std::declval<V>().emplace<T>(t) )>
 { }

int main ()
 {
   foo(A{});  // compile
   // foo(0); // compilation error
 }

显然,只有当所有变体类型都不同并且具有复制构造函数(隐式或显式)时,这才有效。