0

私が持っているとしましょう:

class Base
{
    public:

        void operator()()
        {
            this->run();
        }

        virtual void run () {}
}

class Derived : public Base
{
    public:

        virtual void run ()
        {
            // Will this be called when the boost::thread runs?
        }
}

int main()
{
    Base * b = new Derived();
    boost::thread t(*b); // <-- which "run()" function will be called - Base or Derived?
    t.join();
    delete b;
}

私のテストから、私はDerived::run()呼ばれることができません。私は何か間違ったことをしていますか、それともこれは不可能ですか?

4

2 に答える 2

2

*bオブジェクトを実際に「スライス」Derivedする、つまりBaseインスタンスを値で渡す。Derived次のように、ファンクターをポインター(またはスマートポインター)で渡す必要があります。

thread t(&Derived::operator(), b); // boost::bind is used here implicitly

もちろん、b寿命に注意してください。

于 2012-11-21T06:04:45.043 に答える
0

@GManNickGのコメントは最もクリーンな答えであり、完璧に機能します。Boost.Refは行く方法です。

thread t(boost::ref(*b));
于 2012-11-30T13:23:32.373 に答える