【问题标题】:Variant of variants in C++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 提供支持的东西;这一切都在您的代码中。

标签: c++ templates 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; 是我要做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2017-10-12
    • 1970-01-01
    • 2011-04-16
    • 2021-12-17
    • 2023-04-09
    相关资源
    最近更新 更多