c++ - 范围枚举和 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_1
or sel_2
。如果我试试这个,我会得到
error: selection is not a constant expression
真的,我想将选择的类型存储在类中,并让用户只将它传递给 my_class 的构造函数,以选择是否将option1
对象option2
添加到向量中。
有没有办法可以使用这样的枚举?我觉得我错过了一些非常简单的东西。
解决方案
此代码存在多个问题。
您尝试在需要编译时索引的 std::get 中使用运行时索引
您正在尝试在 std::variant 中进行选择,而变体不会同时保存多种类型(元组可以)。另请注意,变体已经知道它当前拥有的类型。
作为一个额外的问题:应该很少使用 IMAO 元组,因为从可读性的角度来看它非常丑陋,带有命名成员的结构通常要好得多。
推荐阅读
- java - 从依赖中获取资源
- python - 为什么我们不能在 python-3.x 中使用 len() 函数与 len() 函数交织在一起
- jmeter - 如何在非 GUI 模式下运行 jmeter 时获得样本吞吐量?
- scala - 是否可以使 Spark UDF 与可能为 None 的 Array 一起使用?
- php - Cakephp3.8-无记录时显示的页面较多
- istio - 从 Helm 迁移到 Istioctl
- php - 如果语句不起作用,管理员只能访问页面
- linux - java -version 显示较早版本,但已安装 java 11
- django - 使用 WebSocketCommunicator 在 Django Channels v2 测试中进行身份验证
- python - 如何过滤 Pandas DataFrame 范围内的日期?