2

オブジェクトへのポインターと、boost::function と boost::bind を使用して構築されたファンクターからファンクターが呼び出すメソッドの指示を取得したいと考えています。これにより、どのファンクターを実行する必要があるかの順序を自動的に決定できます。

次の(疑似)コード(POINTER_OFMETHOD_OFを参照)は、私がやろうとしていることを示しています。

class myClassA
{
  public:
    DoIt(int i) { return i+i; }
};

class myClassB
{
  public:
    DoItToo(double d) { return d*d; }
};

typedef boost::function0<int> Functor;

myClassA classA;
myClassB classB;

Functor funcA = boost::bind( &myClassA::DoIt, &classA, 10 );
Functor funcB = boost::bind( &myClassB::DoItToo, &classB, 12.34 );

// Create a vector containing some functors and try to determine the objects
// they are called upon and the methods they invoke
std::vector<Functor> vec;
vec.push_back( funcA );
vec.push_back( funcB );

for (int i = 0; i < vec.size();i++)
{
  if (POINTER_OF(vec[i]) == &classA)
  {
    // This functor acts on classA
    if (METHOD_OF(vec[i]) == &myClassA::DoIt)
    {
      // This functor calls the 'DoIt' method.
    }
    else if (METHOD_OF(vec[i]) == &myClassB::DoItToo)
    {
      // This functor calls the 'DoItToo' method.
    }
  }
  // etc...
}

前もって感謝します!

4

3 に答える 3

4

以下はあなたの質問に対する厳密な回答ではないことは承知していますが、.

これをしないでください。代わりにポリモーフィズムを使用してください。これは、現在のプロジェクト コードで見た最も奇妙なことの 1 つです。関数ポインタが「someFunction」を指している場合、追加のアクションを実行します。

Decorator デザイン パターンを使用すると、クラスをあまり変更せずに追加の動作を追加できます。これにより、myClassA::DoIt が Decorator::DoIt で拡張されます。

http://en.wikipedia.org/wiki/Decorator_pattern

于 2009-03-23T15:12:30.227 に答える
0

いいえ、ブーストバインド(つまりMETHOD_OF)に設定されているブースト関数のターゲットを取得できるとは思いません。ブーストメーリングリストのこの投稿によると、これはバインドのリターンタイプが正式に指定されていないためです。

編集:この質問に関連する以前の質問へのリンク:demode-boostfunction-to-a-plain-function-pointer

于 2009-03-23T19:29:21.607 に答える