簡體   English   中英

std::unordered_map 使用枚舉和定義的類

[英]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::MASSBaseSIUnits::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM