C++ 如果变量';什么类型?

C++ 如果变量';什么类型?,c++,c++17,template-meta-programming,typetraits,variant,C++,C++17,Template Meta Programming,Typetraits,Variant,我有一些variant使用V=std::variant是一种增强解决方案 是否可以实现std::variant的逻辑 理想情况下,类型特征应该看起来像是\u变体\u类型之一模板 constexpr bool是一个变量类型=false; 模板 constexpr bool是多种类型中的一种 =(标准::是相同的吗; 模板 自动foo(常数T&) ->std::如果启用,则启用; 并希望我的函数foo是std::enable_ifed,前提是传递了V的一种类型(没有明确指示它们) 我想您可以简单

我有一些variant
使用V=std::variant是一种增强解决方案

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

理想情况下,类型特征应该看起来像
是\u变体\u类型之一

模板
constexpr bool是一个变量类型=false;
模板
constexpr bool是多种类型中的一种
=(标准::是相同的吗;
模板
自动foo(常数T&)
->std::如果启用,则启用;

并希望我的函数foo是
std::enable_if
ed,前提是传递了
V
的一种类型(没有明确指示它们)

我想您可以简单地尝试,在
decltype()
中,在
V
值中放置
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
 }
#包括
#包括
结构A{};
结构B{};
结构C{};
使用V=std::variant;
模板
自动foo(T const&T)
->std::void\u t
{ }
int main()
{
foo(A{});//编译
//foo(0);//编译错误
}

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

变量可以是任何类型;如果变体实际上不是有效的替代品,foo会怎么做?@Yakk AdamNevraumont,
foo
采用变体的一些类型,而不是变体本身。(这些类型的变体本身可能是变体,但这不应影响解决方案。)感谢您提供的智能解决方案!请您解释一下为什么
显然只有在所有变体类型都不同的情况下才有效。
?因为
emplace()
方法只有在
T
Tipes…
中恰好出现一次时才可用(给定
std::variant
)。不是唯一的问题:
T
必须可以从
T
值构造,因此您需要为
Tipes…
中的每个类型都使用一个复制构造函数(隐式,如我的示例中所示,或显式)。所以,是的:这是一个聪明的解决方案;但是有几个很大的限制。谢谢!我不知道。我已经测试了你的解决方案。还有一些限制:类型不能是不完整的(即,如果在定义之前使用foo,则前向声明的类型将无法编译),当然,对构造函数的限制是痛苦的。@Nestor-yes。。。不完整性是另一个问题。
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>>;
#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
 }