【问题标题】:Get the underlying type of a std::variant获取 std::variant 的底层类型
【发布时间】:2018-02-07 18:54:58
【问题描述】:

快速提问:

是否可以在运行时获取std::variant 使用的底层类型?

我的第一个猜测是像这样使用decltype()

    std::variant<int, float> v;
    v = 12;
    std::vector<decltype(v)> vec;

但我的向量声明的类型是std::vector&lt;std::variant&lt;int, float&gt;&gt; 而不是std::vector&lt;int&gt;

知道如何实现这一目标吗? :)

【问题讨论】:

  • @EdHeal holds_alternative 检查变体当前是否拥有给定类型(这很好),但不直接返回基础类型:/
  • 取决于你想要什么,std::visit 可能会有所帮助。
  • std::variant&lt;int,float&gt; 的情况下,与仅使用double 相比几乎没有优势,它可以完全保存所有ints 和所有floats。此外,GCC 报告sizeof(std::variant&lt;int,float&gt;) == sizeof(double),因此也没有任何额外的内存用于存储doubles。当然,这并不意味着问题无效,因为您可能只是为了问题而简化了用例。

标签: c++ variant c++17


【解决方案1】:

是否可以在运行时获取 std::variant 使用的底层类型?

确实是这样

知道如何实现这一目标吗?

您尝试实现与“在运行时获取 std::variant 使用的底层类型”截然不同的东西,如在运行时定义 std::vector 类型。这是一个非常不同的问题,并且在此表单中绝对不可能,因为模板实例化发生在编译时。最接近的解决方案是使用 std::variant&lt;std::vector&lt;int&gt;, std::vector&lt;float&gt;&gt; 并根据来自变量 v 的运行时信息使用不同的向量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多