访问向量字段的键 - 枚举 class 或命名空间中的枚举?
Keys to access vector fields - enum class or enum in namespace?
假设我有一个矢量的别名:
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 个字段,如果我决定扩展它,可能会更多。我在解析形式为 data_string = "date: 2903248.12343, position=[124543254.1343214,123213.12341,63456.1234], velocity=[..."
的字符串时创建了它的一个实例。这就是为什么我希望它成为一个向量:使用像 planet_data.push_back(ParseNextDouble(data_string));
这样的东西
请不要对一个不起眼的矢量期望太多功能。
Vector 并非设计用于使用索引以外的键访问它的数据。尽管您的示例在句法和语义上都是正确的,但它们看起来像是对 std::vector
和枚举 class 的误用。每种工具都有其用途,矢量似乎不是最适合您任务的工具。
Enum classes 被引入以提高类型安全性。有了它们,您永远不会混淆 PlanetDataKeys
、SatelliteEphemeris
和 KeplerianOrbitElements
。但在你的情况下,你最终将它们中的任何一个转换为 int,失去了对类型安全枚举的所有征服。
对我来说,最好定义一个 PlanetData
class 和一个接受 PlanetDataKeys
作为参数的下标运算符。
如果您想坚持使用矢量,我会选择第一个变体(带有名称空间)。它更容易读写,而且我相信它甚至不比 enum classes 以这种方式使用更安全。
定义适当类型的作用域常量如何,如下所示:
namespace PlanetDataKeys {
const size_t PosX = 0;
const size_t PosY = 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 个字段,如果我决定扩展它,可能会更多。我在解析形式为 data_string = "date: 2903248.12343, position=[124543254.1343214,123213.12341,63456.1234], velocity=[..."
的字符串时创建了它的一个实例。这就是为什么我希望它成为一个向量:使用像 planet_data.push_back(ParseNextDouble(data_string));
请不要对一个不起眼的矢量期望太多功能。
Vector 并非设计用于使用索引以外的键访问它的数据。尽管您的示例在句法和语义上都是正确的,但它们看起来像是对 std::vector
和枚举 class 的误用。每种工具都有其用途,矢量似乎不是最适合您任务的工具。
Enum classes 被引入以提高类型安全性。有了它们,您永远不会混淆 PlanetDataKeys
、SatelliteEphemeris
和 KeplerianOrbitElements
。但在你的情况下,你最终将它们中的任何一个转换为 int,失去了对类型安全枚举的所有征服。
对我来说,最好定义一个 PlanetData
class 和一个接受 PlanetDataKeys
作为参数的下标运算符。
如果您想坚持使用矢量,我会选择第一个变体(带有名称空间)。它更容易读写,而且我相信它甚至不比 enum classes 以这种方式使用更安全。
定义适当类型的作用域常量如何,如下所示:
namespace PlanetDataKeys {
const size_t PosX = 0;
const size_t PosY = 1;
}