2016-04-11 9 views
0

私がしたいことは次のようなものです。マクロのメンバーとインフルエンスのコンストラクタを追加しました

class MyClass { 
    list<FieldType> allFields; 
    ADDFIELD(field1, Type, args); 
    ADDFIELD(field2, Type, args); 

    MyClass(){ 
     MAKE_FIELD_LIST(); 
    } 
} 

、それはMAKE_FIELD_LIST()は、各フィールドがリストオブジェクトallFieldsADDFIELDを使用して追加置く

class MyClass { 
    list<FieldType> allFields; 
    Type field1 = Type(args); 
    Type field2 = Type(args); 
    MyClass(){ 
     allFields.put(field1); 
     allFields.put(field2); 
    } 
} 

に展開されています。私は単純なもののために過去にマクロを使用しましたが、格納することができ、変数名の配列に追加する方法があるかどうかはわかりません。MAKE_FIELD_LISTによって使用されます。

+2

なぜこれが欲しいですか? – GManNickG

+1

"次のようなもの"の結果はどうなると思いますか?マクロを扱うときの重要なステップは、展開すべきものを定義することです。 – molbdnilo

+0

@ GManNickGには、各フィールドが実際にバッファ内のある範囲への参照にすぎない多くのオブジェクトがあります。メンバーがすべて検証される必要があり、それをリストオブジェクトに入れると、かなり簡単になることがあります。それ以外の場合は、名前でメンバーにアクセスできることが望ましい。 – Jias

答えて

0

個別のメンバーを使用する代わりに、tupleという単一のメンバーを使用することができます。文字列のmapでクラスを関連付けることもできますが、正しい要素にアクセスすることもできます。

class foo 
{ 
public: 
    template <typename T> 
    void AddMember(const T& t) { 
     std::tuple_cat(members_, std::make_tuple(t)); 
    } 
private: 
    std::tuple<>members_; 
}; 
+0

残念ながら、C++ 98をほとんどサポートしていない古いコンパイラを使用しています。私はC++ 11クラスを使用できることを夢見ています。 – Jias

+0

本当ですか?なぜあなたはアップグレードしていないのですか?あなたがアップグレードするのがとても簡単なときに、そのようなコンパイラに悩まされていることは私にとっては馬鹿げているようです。 –

関連する問題