如果其中一种变体类型,如何启用模板功能?
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
。
并且希望我的函数 foo
在 V
的一种类型被传递时被 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>>;
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
}
显然,只有当所有变体类型都不同并且具有复制构造函数(隐式或显式)时,这才有效。
我有一些变体 using V = std::variant<A, B, C>
和一些带有原型 void foo(const T&)
的函数 foo
。
并且希望我的函数 foo
在 V
的一种类型被传递时被 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>>;
And want my function foo to be
std::enable_if
ed if one ofV
'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
}
显然,只有当所有变体类型都不同并且具有复制构造函数(隐式或显式)时,这才有效。