gpt4 book ai didi

c++ - std::unordered_map 使用枚举和定义的类

转载 作者:行者123 更新时间:2023-11-30 05:29:25 27 4
gpt4 key购买 nike

我正在尝试定义一个 std::unordered_map,使用 enum class 作为键,使用定义的类作为引用对象:

std::unordered_map<Dimension, unit, EnumClassHash> SI_Dim;
SI_Dim[Dimension::MASS] = BaseSIUnits::kilogram;

Dimension 是一个 enum class 在单独的头文件中声明为

enum class Dimension{MASS, TIME, LENGTH, TEMPERATURE, CURRENT, QUANTITY, ANGLE, FORCE, ENERGY, POWER,
AREA, VOLUME, NONDIMENSIONAL};

使用 EnumClassHash 作为散列函数(如果相关,我可以发布代码)。

BaseSIUnits::kilogram 在此上方几行定义为

const unit BaseSIUnits::kilogram = unit(1, "kg", Dimension::MASS);

编译得很好。但是 SI_Dim[Dimension::MASS] = BaseSIUnits::kilogram; 行给我一个错误。在 QtCreator(我的 IDE)中它说“需要一个声明”并且 g++ 给出错误“SI_Dim 没有命名类型”。这些对我来说都没有任何意义。此外,当查看 QtCreator 中的行时,Dimension::MASSBaseSIUnits::kilogram 都未突出显示(几乎就像无法识别它们一样,即使我知道它们是)。我对 std::unordered_map 没有太多经验,所以这可能是我遗漏的一些简单语法错误。但根据我看过的例子,语法对我来说看起来很合适。

最佳答案

正如 Praetorian 在评论中指出的那样,您实际上不能在 C++ 函数之外拥有代码(初始化全局/静态变量除外)。如果您需要这样的代码(即不能写成初始化的代码),那么您可以编写一个函数 init_si_dim ,该函数需要在使用前调用(一次)。参见 this question寻求一种通过在构造函数中进行初始化的临时类的全局对象来自动执行此操作的方法。

在一个单独的方向上,为您的 enum 类型使用无序映射似乎有点奇怪。鉴于您的值很少,并且没有为 enum 值分配特定的整数值,我认为您最好使用随机访问容器,例如,通过 std::array .

考虑以下代码

#include <array>                                                                                                                            

enum class dimension{mass, time, length};

inline constexpr std::size_t dimension_to_index(dimension d)
{
return static_cast<std::size_t>(d) - static_cast<std::size_t>(dimension::mass);
}

struct foo{};

std::array<foo, 1 + dimension_to_index(dimension::length)> v;

int main()
{
v[dimension_to_index(dimension::time)];
}

我们首先有 enum,然后是将其值转换为索引的安全函数。然后我们定义一个 array 对象。正如您在 main 中看到的,现在可以通过 enum 值访问 array 元素。

关于c++ - std::unordered_map 使用枚举和定义的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com