1

假设我有一个向量的别名:

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)];

这有点尴尬。

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

编辑混叠向量的一些解释:

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

4

2 回答 2

2

请不要期望一个不起眼的向量提供太多功能。

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

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

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

如果您想坚持使用向量,我会选择第一个变体(带有命名空间)。它的读写要容易得多,而且我相信它甚至不比以这种方式使用的枚举类安全一点。

于 2017-08-02T10:40:57.877 回答
0

只定义适当类型的作用域常量怎么样,如下所示:

namespace PlanetDataKeys {
  const size_t PosX = 0;
  const size_t PosY = 1;
}
于 2017-08-02T11:10:34.697 回答