1

std::bind を使用して、クラス メンバー関数を含むラムダを作成しましたが、boost::signals2 はそれを受け入れません。

を呼び出してCut、新しいものがある場合に通知したいクラスがあります。Eventvoid Cut::newEvent(Event& e)

Cut のインスタンスへのラムダ バインディングを作成しましたが、Event を渡すと期待どおりに動作します。(コードはコンパイルされ、出力は「Registered new event」です。)

ただし、このラムダをインスタンスに接続しようとするboost::signals2::signal<void(Event&)>と、次のメッセージが表示されます。

error: 'f' cannot be used as a function

main() の関数として使用できるため、これは奇妙です。std::function<void(Event&)>( auto の代わりに使用しても同じ結果が得られます。

これを機能させることは可能ですか?現在機能していないのはなぜですか?

これは関連するコードです:

#include <iostream>
#include <boost/signals2.hpp>

//Dummy event class
struct Event
{ int val; };

typedef boost::signals2::signal<void (Event&) >
EventBroadcaster;

//Class I want to notified of new events
class Cut
{
    public:
        void newEvent( Event& e)
        {
            std::cout << "Registered new event" << std::endl;
            fResult = true;
        }

        bool check() const
        { return fResult; }

    private:
        bool fResult;
};

int main()
{

    Cut c{};

    //Lambda to call newEvent on c
    auto f =
        std::bind( &Cut::newEvent, &c,
                std::placeholders::_1) ;

    Event e{};
    f(e); //works

    EventBroadcaster eb;
    eb.connect(&f); //doesn't work
}
4

1 に答える 1

2

使用する必要があります

eb.connect(f);

f呼び出し可能な関数オブジェクトであるため、&f呼び出し可能ではありません。

于 2013-07-23T12:20:51.660 に答える