2013-10-16 83 views
4

我正在尋找一個使用C++ 03標準的解決方案(我被限制使用這個版本的標準幾年了)。 C++ 11的解決方案也是受歡迎的,但不會被「接受」爲這個問題的答案。C++「Floating Point Enum」

什麼是一種簡單,簡潔的方式,我可以將一組相關常量浮點值表示爲單一類型(類似於枚舉),以確保類型安全性而不會產生大量開銷,並且仍然允許我操作值直接浮動?

最終的結果是,我希望能夠做到像下面這樣:

enum FloatingPointEnum 
{ 
    VALUE1 = 0.1234f, 
    ... 
    VALUEN = 0.6789f 
}; 


float SomeFunction(FloatingPointEnum value) 
{ 
    float new_value; 
    /* perform some operation using "value" to calculate "new_value" */ 
    new_value = static_cast<float>(value); // <- a simplistic example 
    return new_value; 
} 

雖然我能想到的幾個解決方案,他們都不是乾淨/簡單/簡單的,因爲我會喜歡和我認爲有人必須已經有一個優雅的解決方案,這個問題(但我似乎無法找到一個在我的搜索)。

編輯:

我想下面的調用將不直接指定爲枚舉類型的值的值SomeFunction無法編譯:

float nonEnumeratedValue = 5.0f 
SomeFunction(nonEnumeratedValue); 
+3

型安全<->「仍然允許我直接作爲花車操作值」你是什麼意思?如果存在從該類型到「浮動」的隱式轉換,則它不會是類型安全的。如果沒有,則不能直接作爲「浮動」*進行操作。你能提供一些例子嗎? – dyp

+0

由於類型安全,您希望編譯失敗的代碼示例會很有幫助。 – hyde

回答

6

人必須已經有一個優雅的解決方案來解決這個問題

有很多問題沒有優雅的解決方案(許多根本沒有解決方案)。是什麼讓你認爲這個問題有一個?這個假設是非常錯誤的。你可以得到最接近的是使用包裝類。

class FloatingPointEnum { 
    float f; 
    FloatingPointEnum(float arg) : f(arg) {} 
public: 
    static const FloatingPointEnum Value1; 
    static const FloatingPointEnum Value2; 
    operator float() const { return f; } 
}; 
const FloatingPointEnum FloatingPointEnum::Value1(0.1234f); 
const FloatingPointEnum FloatingPointEnum::Value2(0.6789f); 
+2

謝謝你的相對優雅的答案。關於你對「人們必須已經有一個優雅的解決方案來解決這個問題」的評論:互聯網社區一次又一次地向我展示了一些優雅的問題解決方案。我認爲最好去問問,而不是重新發明輪子並從一個方形開始。 – statueuphemism

+0

這很公平,我不會說你錯了,但假設存在解決方案並不好。 – Puppy

0

在C++ 11中,你可以使用constexpr來實現你想要的。

constexpr - 指定的變量或函數的值可以在常量表達式

http://en.cppreference.com/w/cpp/language/constexpr

隨着constexpr你定義一個編譯時間常數出現。這僅適用於文字類型,如float。由於在同一時間,我們希望

float nonEnumeratedValue = 5.0f; 
SomeFunction(nonEnumeratedValue); 

失敗,我們不能用一個簡單的typedef。相反,我們使用Boost的BOOST_STRONG_TYPEDEF。現在

#include <boost/serialization/strong_typedef.hpp> 

BOOST_STRONG_TYPEDEF(float, FloatingPointEnum); 
constexpr float VALUE1 = 0.1234f; 
constexpr float VALUEN = 0.6789f; 

float SomeFunction(FloatingPointEnum value) 
{ 
    float new_value; 
    /* perform some operation using "value" to calculate "new_value" */ 
    new_value = static_cast<float>(value); // <- a simplistic example 
    return new_value; 
} 

,你可以調用函數只與FloatingPointEnum實例。不幸的是,實例化語法是不是很好了

FloatingPointEnum f {VALUEN}; 

或者,你可以簡單地使用d編程語言,其中浮點枚舉的支持和下面的代碼按預期工作:

enum FloatingPointEnum 
{ 
    VALUE1 = 0.1234f, 
    //... 
    VALUEN = 0.6789f 
}; 


float SomeFunction(FloatingPointEnum value) 
{ 
    float new_value; 
    new_value = value; // No cast needed, welcome to D! 
    return new_value; 
} 

調用SomeFunctionfloat導致

Error: function test.SomeFunction (FloatingPointEnum value) is not callable using argument types (float)