2011-09-08 20 views
0

C++を使用する(Visual Studio)私は、列挙型に変換するためのソリューションを見つけるしようとしています。私は妥当な解決策であると思われるXマクロス(http://drdobbs.com/cpp/184401387)に出くわしましたが、クラス内で作業するのは苦労しています。私が見たすべての例は、クラスの外で定義されたすべてを示しています。C++:Xマクロを使用してクラス内で列挙型と文字列型を定義しますか?

// ColorNames.h 
X(Red, "Red"), 
X(Blue, "Blue"), 
... 


// MyClass.h 
class MyClass 
{ 
public: 
    MyClass(); 
    virtual ~MyClass(); 

    #define X(a, b) a 
    enum Colors { 
     #include "ColorNames.h" 
    }; 
    #undef X 

    #define X(a, b) b 
    char *colorNameStrings_[] = { 
     #include "ColorNames.h" 
    }; 
    #undef X 
} 

IDEを使用すると、ヘッダファイル内のデータメンバ変数を初期化することはできませんので、私は推測するライン*colorNameStrings_[] =...にチョーク?これをどのように機能させるには?

+0

なぜマクロを使うのか? –

+1

私の目標は、文字列マッピングへの列挙を持つことです。 Xマクロスの考えは、マッピングが同期していることを保証することです。 – User

答えて

2

への回答で、一般的な、Boost.Preprocessorベースの列挙ツー文字列名変換の基本的な実装を提供しましたクラス定義。

あなたはおそらくそのようにそれをしなければならないでしょう:

// MyClass.h 
class MyClass 
{ 
public: 
    MyClass(); 
    virtual ~MyClass(); 

    #define X(a, b) a 
    enum Colors { 
     #include "ColorNames.h" 
    }; 
    #undef X 

    static const char * colorNameStrings_[]; 
}; 

そして、.cppファイル内:

// MyClass.cpp 
#include "MyClass.h" 

#define X(a, b) b 
const char * MyClass::colorNameStrings_[] = { 
    #include "ColorNames.h" 
}; 
#undef X 
1

は次に、この

struct convert 
{ 
    std::map<MyEnum, std::string> mapping; 

    convert() 
    { 
      mapping[SOME_ENUM_VALUE] = "SomeValue"; 
      // etc to fill map 
    } 

    std::string operator()(MyEnum enum) 
    { 
     return mapping[enum];  
    } 

}; 

のような構造体を使用して、次のように使用します。代わりに、X-マクロを使用しての

convert c; 
std::string ret = c(myenum); //calls operator() 
+0

それはばかげて冗長です。また、関数が行うときに構造体を使う理由は? –

+0

@Etienne、それは私が変換を必要とする列挙型の負荷を持っていたときにそれをやっていたことです。 –

+1

構造体でそれを行う利点は、より多様なスコープでそれらを定義できることです。関数では、関数内でインラインから、ヘッダ内に完全に制限されています。 –

2

the Boost.Preprocessor libraryを使用することを検討してください。コード生成マクロの初期の一回の定義では少しの作業が必要ですが、最終結果ははるかにクリーンで、再利用ははるかに簡単です。

は、私はこの問題は、あなたが内部の非静的定数を初期化することができないということです "How to convert an enum type variable to a string?"

関連する問題