2017-01-31 25 views
-3

我喜歡使用枚舉類來儘可能避免硬編碼值,但對於字符串來說它有點複雜。我有一個我想要分享的設計,我覺得它有點笨重,我很想談談如何簡化它。如何在C++中創建一個類型安全的字符串「定義」對象?

class StringDefinition 
{ 
private: 
    StringDefinition(const std::string &def); 

public: 
    bool operator==(const StringDefinition&rhs) const; 

public: 
    static const StringDefinition StringDefinitionOne; 
    static const StringDefinition StringDefinitionTwo; 
    static const StringDefinition StringDefinitionThree; 

public: 
    std::string ToString() const; 

private: 
    string stringDef; 
}; 

StringDefinition::StringDefinition(const std::string &stringDef) 
{ 
    this->stringDef = stringDef; 
} 

const StringDefinition StringDefinition::StringDefinitionOne("One"); 

etc... 

歡迎任何意見和建議。

編輯:我沒有使用字符串文字,因爲它不強制開發人員使用定義列表中的值。即使你希望他們使用你的字符串,他們仍然可以硬編碼一個字符串。如果我在做一些瘋狂的事情,我會喜歡一些建設性的批評,而不是僅僅投票回答問題。

+0

這是什麼導致只是一個命名的全局字符串文字? – Borgleader

+0

我不想僅僅使用const字符串創建對象,因爲那樣的話字符串就是字符串。任何人仍然可以硬編碼一個字符串。假設我創建了一個方法,並且我想傳入一個StringDefinition,我可以這樣做。如果我使用字符串文字,某人可以傳遞一個硬編碼的字符串 – Pittfall

+0

std :: tuple '也許? –

回答

0

這是個人品味的問題,但如何讓它更簡單一點;沿線的東西:

enum class Foo { Ack, Eek }; 

explicit operator std::string(Foo foo) { 
    static const char* const names[] = { "Ack", "Eek" }; 
    return names[(int)foo]; 
} 
相關問題