2017-01-31 11 views
-3

ハードコードされた値を可能な限り避けるためにenumクラスを使用するのが好きですが、文字列に関しては少し複雑です。私は、私が少しかさばっていると感じることを共有したいと思っているデザインを持っています。それを単純化する方法についてのアイデアが大好きです。C++で型安全な文字列 "definition"オブジェクトを作成するにはどうすればよいですか?

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]; 
} 
関連する問題