2017-06-12 3 views
0

により、クラスのメンバを呼ぶ++。しかし、このメンバを自動的にマップに追加して、文字列で簡単にアクセスできます。cが、私はいくつかのメンバーを持つべきであるクラスCを持っている文字列

だから、アイデアは...パラメータとマップまたは何か他のものにそれ保存構造体と呼ばれる構造体を持つことである

しかし、私はマップを使用する必要がありますどのようにSHUREありませんよ。私の考えは、メンバ値へのポインタを持つマップを作成することでした。しかし、どのようにstructコンストラクタでこのメンバを初期化するのですか?

template <typename C> 
    struct parameter { 
    typedef int (parameter::*mfp)(int); 
    static std::map<std::string, mfp> registered_parameter; 

    parameter(std::string name) { 
     // todo... 
    } 

    // parameter overloading code and something other here ... 
    }; 

テンプレートには、各クラスの静的マップがあります。 C1とC2クラスは異なるマップを持つ必要があります。

C1 could be look: 
class C1: public C { 
    parameter<C1> x("x"); 
    parameter<C1> y("y"); 
} 

など、私が何かをやっている場合:

C1 c1_1; 
C1 c1_2; 

// should be different x 
c1_1.x = 2 
c1_2.x = 3 
+3

C++は、このように動作しません。 –

+0

'mfp'はメンバ関数へのポインタであり、メンバ値へのポインタではありません。 'parameter'は' mfp'が指し示すことができるメンバを持っていません。 'c1_1.x'は' parameter'ですが、 'c1_1.x = 2;'をコンパイルする 'operator =(int)'はありません。質問を完成させ、 'parameter'があなたが望むことを仮定して書くコードの例を示してください。現在あなたの例は何もしていません。 – nwp

+0

クラスCはパラメータstruct inを持っていますが、オーバーロードのように書く必要はありませんが、明らかに演算子のオーバーロードが必要であるためです。で、私は「この」マップに私は簡単 'this'あなたが参照している文字列 – R3Tech

答えて

0

が、私は「この」マップ

にそして、あなたが知っていることはできませんを追加する方法を知りませんそれはthisを地図に追加できないためです。このマップには、メンバー関数のポインタ(parameter)が含まれています。 thisparameterのメンバ関数が、parameterへのポインタではありません。

それはCのメンバーであるパラメータに文字列からのマッピングを持っているあなたの意図のように見えるので、マップされた型は、型パラメータのCのメンバーポインタでなければならないようです。さらに、マップをconstにすることをお勧めします。結局のところ、クラスは実行時に変更されないので、ほとんど間違いであるためマップの変更を防ぐのが最善です。

static const std::map<std::string, parameter C::*> registered_parameter; 

しかし、どのように構造体のコンストラクタでこのメンバーを初期化するには?

あなたはコンストラクタの静的メンバを初期化しないでください。静的メンバのインスタンスは1つしかありません。最初のオブジェクトが構築される前に初期化する必要があります。もちろん、各クラスの初期化を特化する必要があります。

静的メンバは次のように特殊なことができます、しかし

template<> 
const std::map<std::string, parameter<C1> C1::*> 
parameter<C1>::registered_parameter = { 
    {"x", &C1::x}, 
    {"y", &C1::y}, 
}; 

は、パラメータのメンバーがこれが動作するために、公開する必要があることに注意してください。

関連する問題