1

別のクラスのオブジェクトへのポインタを含むセットから派生したクラスがあります。基本的には次のようになります。

class connectionSLOT: private std::set<connectionSLOT*>
{
...
};

それは非常に単純で、おそらく(有向)グラフを表現するためにうまく機能します。私のクラスには、connect()、disconnect()などの単純なメソッドも含まれています。これらはすべて、引数としてオブジェクトポインターを期待し、そのようなポインターを返します。(つまり、宣言は名前だけが異なります)例:

connectionSLOT* connectionSLOT::connect(connectionSLOT *A)
{
  insert (A); return A;
}

または:

connectionSLOT* connectionSLOT::disconnect(connectionSLOT *A)
{
  erase(A); return this;
}

したがって、私の問題は、これらの関数をオブジェクト自体ではなく、セットに含まれる(つまり、呼び出し元のオブジェクトに含まれる)すべてのオブジェクトに適用する新しいメソッドを作成するにはどうすればよいですか?

私はこのようなものが欲しいです:

connectionSLOT* new_method( 'passing a method (and its argument) ' )
{
  for(it=begin();it!=end();++it) 'execute the method on (*it)' ;
  return something;
} 

おそらく、すべての隣接するポイントを特定の頂点に接続するために適用されます。ただし、new_method()自体も適切な関数であるため、次のように渡すこともできます。

int main()
{
  // ... here declaring some objects and connection amongst them...

  A->new_method( new_method( disconnect(B) ) ) ;

/* calling new_method() recursively to disconnect all the vertices from B which ones are
    reachable from A in two steps */

...
}

なんとかできるといいのですが。(構文は基本的に重要ではありません)提案をしていただければ幸いです。

ロバート

4

1 に答える 1

0

C ++ 11を使用できますか?std::functionそれとラムダ式があなたが探しているものだと私は信じています。

void DoSth(std::function<void(void)> fn)
{
    fn();
}

DoSth([]() { printf("Hello, world!\n"); });

あなたのコードはもっと-以下のようになります:

connectionSLOT::new_method(std::function<void(connectionSlot *)> fn)
{
    for (it = begin(); it != end(); ++it)
        fn(*it);

    return something;
} 

int main()
{
    // ... here declaring some objects and connection amongst them...

    A->new_method([](connectionSlot * B) { disconnect(B); } );

    // ...
}
于 2013-03-25T07:37:35.197 に答える