5

クラスを作成していることに気づきました

template <typename T> struct invoker {
  void operator()(T& it) const {it();}
};

そのため、さまざまなインスタンスで繰り返しinvoker<foo>呼び出したいもの(自分の制御下にないもの)にを渡して、それらの呼び出しをのメソッドに転送することができます。invoker<foo>::operator()(foo&)foofoofoo::operator()()

ほんの数行であることは知っていますが、これはおそらくSTLの機能によってすでに提供されているようなもののようですboost::bind。トリックがあれば、私には見えません。(私はこのようなものを使用する最初の人ではないと確信しています;それは名前を持っていますか?)

4

2 に答える 2

6

さて、あなたはstd::bindおそらくboost::bind同じ振る舞いを達成するために使うことができます:

#include <string>
#include <iostream>
#include <functional>

struct foo {
    void operator()() {
        std::cout << "Hallo, im at addr: " << std::hex << this << std::endl;
    }
};

int main() {
    std::function<void(foo*)> fun = std::bind(&foo::operator(), std::placeholders::_1);
    foo f1, f2;
    fun(&f1);
    fun(&f2);
}

出力:

Hallo, im at addr: 0xbffc396a
Hallo, im at addr: 0xbffc3969

引数の型にテンプレートクラスを使用すると、車輪の再発明をしなくても同じ動作をすることができます。

編集:Crazy Eddieが指摘したように、boost::mem_fnまたはstd::mem_fn:を使用できます。

std::function<void(foo*)> fun = std::mem_fn(&foo::operator());

の代わりにbind

于 2012-05-15T23:53:02.983 に答える
5

ええ、あなたは車輪の再発明をしています。std::mem_fun_refはあなたが望むことをします。

std::vector<foo> foos;

...

std::for_each(foos.begin(), foos.end(), std::mem_fun_ref(&foo::operator()));

または:

std::vector<foo*> foos;

...

std::for_each(foos.begin(), foos.end(), std::mem_fun(&foo::operator()));

パラメータがptrであるかどうかを混乱させる必要がないことは、boost::mem_fnの大きな利点の1つです。

それよりもはるかに複雑なものは何でもあり、C ++ 03バインダーで問題が発生し始め、boost.bindのようなより表現力豊かなものが必要になります。

于 2012-05-16T00:19:25.967 に答える