c++ - 访问 vector 字段的键 - 命名空间中的枚举类或枚举?

标签 c++ c++11 vector enums enum-class

假设我有一个 vector 的别名:

typedef std::vector<double> PlanetData;

我希望它的字段可以通过一些键访问:

double x = planet_data[PlanetDataKeys::PosX]; //planet_data is of type PlanetData

我怎样才能实现它?

我可以在命名空间中定义一个枚举:

namespace PlanetDataKeys {
  enum {
    PosX = 0,
    PosY = 1
  };
}

但是 enum class 更安全:

enum class PlanetDataKeys {
  PosX = 0,
  PosY = 1
};

但是,由于将enum class 隐式转换为int 类型是禁用的,因此需要这样写:

double x =  planet_data[static_cast<int>(PlanetDataKeys::PosX)];

这有点尴尬。

在这种情况下哪种方法更好,为什么?

编辑别名 vector 的一些解释:

在实际代码中,PlanetData 有大约 7 个字段,如果我决定扩展它,可能会更多。我正在创建它的一个实例,同时解析 data_string = "date: 2903248.12343, position=[124543254.1343214,123213.12341,63456.1234], velocity=[..." 形式的字符串。这就是为什么我希望它成为一个 vector :使用类似 planet_data.push_back(ParseNextDouble(data_string));

的东西

最佳答案

请不要期望从一个不起眼的 vector 中获得太多功能。

Vector 的设计目的不是使用索引以外的键访问它的数据。尽管您的示例在语法和语义上都是正确的,但它们看起来像是对 std::vector 和枚举类的滥用。每种工具都有其用途,而 vector 似乎不是最适合您任务的工具。

引入了枚举类以提高类型安全性。有了它们,您永远不会混淆 PlanetDataKeysSatelliteEphemerisKeplerianOrbitElements。但在您的情况下,您最终将它们中的任何一个转换为 int,从而失去了对类型安全枚举的所有征服。

对我来说,最好定义一个带有下标运算符的 PlanetData 类,该运算符接受 PlanetDataKeys 作为参数。

如果您想坚持使用 vector ,我会选择第一个变体(带有 namespace )。它更易于读写,而且我相信它甚至不比以这种方式使用的枚举类更安全。

关于c++ - 访问 vector 字段的键 - 命名空间中的枚举类或枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45458109/

相关文章:

c++ - constexpr 上下文中 std::array 指针的 size()

java - 尝试打印 vector 的平均值时出错

c++ - vector 增长时如何强制执行 move 语义?

c++ - 在连续内存中迭代具有公共(public)基类的对象

c++ - 返回存储在类中的 C 字符串

C++ : How is this statement parsed?

android - 从 native 代码访问 apk 中的压缩文件(从 zip 中读取 zip)

c++ - 如何在 Xcode 4.5 中启用 MacPorts 安装的 gcc4.7(和 libstdc++)?

c++ - 可以在 C++11 中有条件地声明友元类吗?

c++ - vector 作为类成员