2014-10-22 44 views
2

我正在寫一個簡單的轉換程序,我想創造一些與此類似:有沒有辦法爲非整數創建枚舉數據類型?

//Ratios of a meter 
enum Unit_Type 
{ 
    CENTIMETER = 0.01, //only integers allowed 
    METER = 1, 
    KILOMETER = 1000 
}; 

有一個簡單的數據結構,讓我來組織這樣的數據?

+3

既然你已經嘗試寫可讀的程序(這是值得稱道的),爲什麼不走一路和使用['的std :: ratio'] (http://en.cppreference.com/w/cpp/numeric/ratio/ratio)用於無量綱比率和用於維度的單獨單位系統? – 2014-10-22 08:24:13

+2

@KerrekSB別忘了[Boost.Units](http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units.html)。 – Angew 2014-10-22 08:25:04

+0

@Mario對不起復制/粘貼:)這是正確的:http://stackoverflow.com/questions/19408305/c-floating-point-enum – manlio 2014-10-22 08:52:59

回答

0

不是真的。雖然C++ 11引入了一些really neat new things for enums,例如特別是能夠爲它們分配一些特定的內部數據類型(如char),無法添加浮點數或任何其他非整數類型。

取決於你實際上試圖做的,我會用一些普通的老式結構此:

struct UnitInfo { 
    const char *name; 
    float  ratio; 
}; 

UnitInfo units[] = { 
    {"centimeter", 0.01f}, 
    {"meter",  1}, 
    {"kilometer", 1000}, 
    {0, 0} // special "terminator" 
}; 

然後,您就可以使用迭代的指針作爲在所有可用的單位迭代器:

float in; 
std::cout << "Length in meters: "; 
std::cin >> in; 

// Iterate over all available units 
for (UnitInfo *p = units; *p; ++p) { 
    // Use the unit information: 
    // p[0] is the unit name 
    // p[1] is the conversion ratio 
    std::cout << (in/p[1]) << " " << p[0] << std::endl; 
} 

如果這是關於使用這些比例與實際值加在一起(如100 * CENTIMETER),那麼C++ 11的user-defined literals可能是你的東西:

constexpr float operator"" _cm(float units) { 
    return units * .01f; 
} 

這然後可以使用這樣的:

float distance = 150_cm; 
0

有一個簡單的數據結構...

並不是這麼簡單,你想與Unit_Type做什麼。您當然可以創建一個Units_Of_Distance類和一些const實例,稱爲centimetre,metre,kilometre等 - 將您的號碼傳遞給構造函數。

如果你不喜歡從頭開始編寫類似的東西,或者想更強大的東西,Kerrek和Angew的評論是好引線....

相關問題