我想使用带有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_1
或sel_2
。如果我尝试这样做,我会得到
error: selection is not a constant expression
我真的想存储在类中选择的类型,并让用户仅将其传递给my_class的构造函数一次
选择是将option1
还是option2
对象添加到向量。
有没有办法使用这样的枚举?我觉得我缺少一些简单的东西。
答案 0 :(得分:1)
此代码存在多个问题。
您尝试使用运行时索引到需要编译的std :: get中 时间索引
您试图在std :: variant中进行选择,而variant不能一次保存多个类型(元组可以)。还要注意,变体已经knows当前拥有什么类型。
作为一个额外的问题:IMAO元组应该很少使用,因为从可读性的角度来看它非常难看,带有命名成员的结构通常要好得多。