1

C++ 11 または Boost を使用して、オブジェクト ポインター (インスタンス)、メソッド ポインター、およびいくつかの引数を格納するオブジェクトを作成し、後でこれらの引数を使用してこのメ​​ソッドを呼び出すことはできますか? つまり、std または Boost テンプレートのみを使用してそれを行う方法は? 私はそれが可能であると確信していますが、最善の方法が何であるかはわかりません。

そして、ここに本当の問題があります: 異なるメソッド (異なる署名を持つ) を参照するいくつかのそのようなオブジェクトを同じコンテナーに格納することは、何らかの方法で可能ですか?

4

2 に答える 2

4

std::bindこれがandの典型的な使用例ですstd::function:

#include <functional>
#include <vector>

using namespace std::placeholders;   // for _1, _2, ...

std::vector<std::function<int(double, char)>> v;

Foo x;
Bar y;

v.emplace_back(std::bind(&Foo::f, &x, _1, _2));         // int Foo::f(double, char)
v.emplace_back(std::bind(&Bar::g, &y, _2, true, _1));   // int Bar::g(char, bool, double)
v.emplace_bacK(some_free_function);                     // int some_free_function(double, char)

使用するには:

for (auto & f : v) { sum += f(1.5, 'a'); }
于 2013-08-14T20:45:08.683 に答える
3

std::bindC++11 で提供されているものを確認してください。それはまさにあなたが望むことをします。これにはブーストも必要ありません。例えば:

class C
{
public:
  void Foo(int i);
}

C c;

// Create a function object to represent c.Foo(5)
std::function<void(void)> callLater=std::bind(&C::Foo,std::ref(c),5);

// Then later when you want to call c.Foo(5), you do:
callLater();
于 2013-08-14T20:40:04.427 に答える