0

プロジェクトの後半で各オブザーバーに新しい機能を追加する必要があるというキャッチを使用して、オブザーバーパターンを実装しようとしています。

class Obsevers {
public:
    virtual ~Obsevers() {}
};

class TestObserver : public Obsevers {
public:
    void print1(int i) {
        std::cout << i << std::endl;
    }
};

class TestObserver2 : public Obsevers {
public:
    void print2(int i, char c) {
        std::cout << i << " , " << c << std::endl;
    }
    //possible new functions here later
};

私の通知方法は次のとおりです。

template<typename Type, typename Notify>
void NotifyObserver(Notify notify) {
    typedef std::list<Obsevers*>::iterator iter;
    iter it = m_observers.begin();
    iter end = m_observers.end();
    for(; it != end; ++it) {
        Type * o = dynamic_cast<Type*>(*it);
        if(o == NULL) continue;
        notify(o);
    }
}

コードを通知するための呼び出しを行うには、次のようになります。

NotifyObserver<TestObserver2>(boost::bind(&TestObserver2::print2, _1, 32, 'b'));

上記のコードブロックのコンテキストを考えると、私の質問は、バインドのオブジェクトパラメータにプレースホルダー(_1)を使用していますか、それともこの未定義の動作ですか?

バインドに関するブーストドキュメントでは、関数パラメーターに対してのみオブジェクトのプレースホルダーを使用するように指定されていませんでした。

4

1 に答える 1

1

あなたのコードは正しいです。

Boost.Bindドキュメントは、あなたのコードが

boost::bind(&TestObserver2::print2, _1, 32, 'b')

と同じです

boost::bind<void>(boost::mem_fn(&TestObserver2::print2), _1, 32, 'b')

whereboost::mem_fnは、メンバー関数へのポインターの呼び出しを担当します。バインドされたオブジェクトがboost::mem_fn、ポインターや参照などの使用可能なもので評価される限り、関数は適切に呼び出されます。

于 2012-09-25T21:12:21.973 に答える