C ++中的变体变体

Posted

技术标签:

【中文标题】C ++中的变体变体【英文标题】:Variant of variants in C++ 【发布时间】:2021-09-13 21:09:25 【问题描述】:

我有以下变体

std::variant<Type1, Type2<subType1>> myVariant;

Type2 是一个模板类,有 2 种可能的子类型 subType1 和 subType2 是可能的。 是否支持以下内容?

std::variant&lt;Type1, Type2&lt;std::variant&lt;subType1,subType2&gt;&gt; myVariant;

如果是,get&lt;index&gt;(myVariant) 将如何处理内部变体?

编辑:修正错字

【问题讨论】:

这完全取决于Type2&lt;T&gt; 是什么,它的界面如何工作,以及您如何访问TType2 的含义。 Type2&lt;T&gt; 对其T 的作用取决于类型。它可以存储一个T,或一组Ts 或其他任何东西。没有专门为 C++ 或 variant 提供支持的东西;这一切都在您的代码中。 【参考方案1】:

是否支持以下内容?

是的,但不是你想的那样。

std::variant<Type1, Type2<std::variant<subType1, subType2>>> myVariant;

与以下内容相同:

using SomeType = Type2<std::variant<subType1, subType2>>;
std::variant<Type1, SomeType> myVariant;

SomeType 是模板化的事实不会改变变体的工作方式。所以:

如果是,get(myVariant) 如何使用内部变体?

get&lt;index&gt;(myVariant) 将返回 Type1Type2&lt;std::variant&lt;subType1, subType2&gt;&gt;。内部变体不会以任何形式或形式发挥作用。

【讨论】:

【参考方案2】:

问题在于std::variant 是一种新类型,并且不同于它可以包含的所有类型。就像一个好的旧工会:

union int_or_double 
    int i;
    double d;
;

它既不是int 也不是double,而是一个可以保存int 值或double 值的独特类型。

所以这里std::variant&lt;Type1, Type2&lt;std::variant&lt;subType1,subType2&gt;&gt; myVariant; 不能只保存Type2&lt;std::variant&lt;subType1,subType2&gt;&gt; 的值,但既不能保存Type2&lt;subType1&gt;,也不能保存Type2&lt;subType2&gt;(当然还有Type1...)。

在现实世界的编程中,我认为std::variant&lt;Type1, Type2&lt;subType1&gt;, Type2&lt;subType2&gt;&gt; 使用起来会简单得多...

【讨论】:

谢谢std::variant&lt;Type1, Type2&lt;subType1&gt;, Type2&lt;subType2&gt;&gt; 是我要做的。

以上是关于C ++中的变体变体的主要内容,如果未能解决你的问题,请参考以下文章

我可以将一个类与模板中的另一个类关联(使用 C++17 变体)吗?

如何处理 C++ 17 中变体中包含的类型的无意义方法

C++17,制作一个使用依赖于模板参数的 std::variant 的可变参数模板?

Go语言的特性

Go语言的特性

C中的目录遍历