1

オブジェクトのメンバー変数の設定を可能にするboost::functionを作成しようとしています。私は、自分がやろうとしている(そして失敗している)ことを理解するために考えることができる最も簡単な例を作成しました。boost :: bindを理解しているように感じますが、boostは初めてで、boost::functionを誤って使用していると思います。

#include <iostream>
#include <Boost/bind.hpp>
#include <boost/function.hpp>

class Foo
{
public:
    Foo() : value(0) {}

    boost::function<void (int&)> getFcn()
    {
        return boost::function<void (int&)>( boost::bind<void>( Foo::value, this, _1 ) );
    }

    int getValue() const    { return value; }

private:
    int value;
};

int main(int argc, const char * argv[])
{
    Foo foo;

    std::cout << "Value before: " << foo.getValue();

    boost::function<void (int&)> setter = foo.getFcn();
    setter(10);     // ERROR: No matching function for call to object of type 'boost::function<void (int &)>'
                    // and in bind.hpp: Called object type 'int' is not a function or function pointer

    std::cout << "Value after: " << foo.getValue();

    return 0;
}

関数を使用してFoo::valueを10に設定したいという、28行目のエラーが発生しています。このすべてが間違っているのでしょうか。これらすべてにブーストを使用する代わりに、int *などを返す必要がありますか?'getFcn()'を呼び出す理由は、実際のプロジェクトでメッセージングシステムを使用しており、必要なデータを含むオブジェクトが存在しない場合、getFcnは空のboost::functionを返すためです。しかし、int *を使用すると、何も見つからなかった場合にNULLを返すことができると思います。

4

1 に答える 1

2

boost::bind<void>( Foo::value, this, _1 )コード内のこれは、基本的Foo::valueにメンバー関数として使用されています。どちらが間違っています。Foo::value関数ではありません。

このステップバイステップで構築しましょう:

class Foo
{
    ...
    boost::function< void (Foo*, int) > getFcn ()
    {
        return boost::function< void (Foo*, int) >( &Foo::setValue );
    }

    void setValue (int v)
    {
        value = v;
    }
    ...
}

int main ()
{
    ...
    boost::function< void (Foo*, int) > setter = foo.getFcn();
    setter( &foo, 10);
    ...
}

したがって、ここで関数はthisオブジェクトを明示的に受け取ります。を使用して最初のパラメータとしてboost.bindバインドしましょう。this

class Foo
{
    ...
    boost::function< void (int) > getFcn ()
    {
        return boost::bind(&Foo::setValue, this, _1);
    }

    void setValue (int v)
    {
        value = v;
    }
    ...
}

int main ()
{
    ...
    boost::function< void (int) > setter = foo.getFcn();
    setter( 10);
    ...
}

(テストされていないコード)

于 2012-10-05T21:31:09.333 に答える