[英]std::unordered_map using enum and defined class
我正在嘗試使用enum class
作為鍵和定義的類作為引用對象來定義std::unordered_map
:
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::MASS
或BaseSIUnits::kilogram
都沒有突出顯示(幾乎好像它們未被識別,即使我知道它們是)。 我對 std::unordered_map 沒有太多經驗,所以這可能是我遺漏的一些簡單的語法錯誤。 但是根據我看過的例子,語法對我來說是正確的。
正如 Praetorian 在評論中指出的那樣,您實際上不能在 C++ 中擁有函數之外的代碼(初始化全局/靜態變量除外)。 如果你需要這樣的代碼(即不能寫成初始化的代碼),那么你可以寫一個函數init_si_dim
,它需要在使用前調用(一次)。 請參閱此問題,了解通過在構造函數中進行初始化的臨時類的全局對象來自動執行此操作的方法。
在另一個方向上,為您的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
元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.