范围枚举和std :: get

时间:2018-09-20 17:32:47

标签: c++ c++17

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

从有效的现代C ++中,我正在使用版本10的版本将枚举类型转换为可与std :: get

一起使用的底层类型_t。
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_1sel_2。如果我尝试这样做,我会得到

error: selection is not a constant expression

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

有没有办法使用这样的枚举?我觉得我缺少一些简单的东西。

1 个答案:

答案 0 :(得分:1)

此代码存在多个问题。

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

  2. 您试图在std :: variant中进行选择,而variant不能一次保存多个类型(元组可以)。还要注意,变体已经knows当前拥有什么类型。

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