2

私は2つのクラスを持っています:

class MyClassInfo {
public:
  void AddMethod(std::string name, void* pointer); // I don't know what signature should be
}
class MyClass
{
public: 
  void SetField1(int f1);
  int GetFileld1();
private:
  int field1;
};

実行時に MyClass のメソッドに名前 (文字列) でアクセスできるようにする必要があります。そのためにライブラリ (boost を除く) やコンパイラ機能 (rtti など) を使用したくありません。

関数ポインターを関数に送信する方法がわからないため、AddMethod メソッドでどのシグネチャを使用すればよいかわかりません。この関数は、任意のメソッドを追加できるユニバーサル関数でなければなりません。Mb、MyClassInfo を使用せずにそれを行うより良い方法を知っています。どんな助けでも大歓迎です。

4

2 に答える 2

2

これは直接 C++ では不可能です。メンバー関数ポインターへの名前のマップを作成するなどの代替手段を検討する必要があります。しかし、それでも一貫したメソッド シグネチャが必要です。

何かのようなもの

std::map<std::string, int (MyClass::*)(void*))

例えば。あなたのAddMethod署名は次のようになります

void AddMethod(std::string name, int (MyClass::* pointer)(void*));

そして、あなたはそれをこのように呼ぶでしょう

info.AddMethod("someMethod", &MyClass::someMethod);
于 2012-11-07T16:27:21.387 に答える
0

通過させたいすべての関数がAddMethod同じ署名を持っている場合 (おそらくいくつかの引数をバインドした後)、次の署名を使用できます。

void AddMethod(std::string name, boost::function<int ()> func);

次のように使用します。

info.AddMethod("GetFileId1", std::bind1st(std::mem_fun(&MyClass::GetFileId1), &MyClassInstance);

関数のシグネチャが異なる場合は、次を使用してそれらを保存できますboost::function_base

void AddMethod(std::string name, boost::function_base func);

上記のように使用します。ここでの課題は、オブジェクトに格納されている型を正確に見つけて、boost::functionそれを使用できるようにすることです。

于 2012-11-07T18:32:58.413 に答える