首页 > 解决方案 > 范围枚举和 std::get

问题描述

我想使用带有 std::get 的范围枚举来访问存储在 std::vector 中的对象

从 Effective Modern C++ 我正在使用第 10 项的版本将枚举类型转换为可以与 std::get 一起使用的基础类型

template<typename E>
constexpr auto to_mytype(E enumerator) noexcept
{
    return static_cast<std::underlying_type_t<E>>(enumerator);
}

enum class my_type{sel_1, sel_2};

我有

std::vector<std::variant<std::unique_ptr<option1>, std::unique_ptr<option2>> my_store;

这是 my_class 的成员,我想像这样使用存储在这个向量中的对象

void my_class::my_function(const my_type selection)
{
    std::get<to_mytype(selection)>(my_store[i])->do_work();
}

选择在哪里sel_1or sel_2。如果我试试这个,我会得到

error: selection is not a constant expression

真的,我想将选择的类型存储在类中,并让用户只将它传递给 my_class 的构造函数,以选择是否将option1对象option2添加到向量中。

有没有办法可以使用这样的枚举?我觉得我错过了一些非常简单的东西。

标签: c++c++17

解决方案


此代码存在多个问题。

  1. 您尝试在需要编译时索引的 std::get 中使用运行时索引

  2. 您正在尝试在 std::variant 中进行选择,而变体不会同时保存多种类型(元组可以)。另请注意,变体已经知道它当前拥有的类型。

作为一个额外的问题:应该很少使用 IMAO 元组,因为从可读性的角度来看它非常丑陋,带有命名成员的结构通常要好得多。


推荐阅读