24

私は現在ブーストスレッドを勉強しています。そして、スレッド クラスには、呼び出し可能なオブジェクトを受け入れるコンストラクターがあることに気付きました。呼び出し可能オブジェクトとは

class CallableClass
{
private:
    // Number of iterations
    int m_iterations;

public:

    // Default constructor
    CallableClass()
    {
        m_iterations=10;
    }

    // Constructor with number of iterations
    CallableClass(int iterations)
    {
        m_iterations=iterations;
    }

    // Copy constructor
    CallableClass(const CallableClass& source)
    {
        m_iterations=source.m_iterations;
    }

    // Destructor
    ~CallableClass()
    {
    }

    // Assignment operator
    CallableClass& operator = (const CallableClass& source)
    {
        m_iterations=source.m_iterations;
        return *this;
    }

    // Static function called by thread
    static void StaticFunction()
    {
        for (int i=0; i < 10; i++)  // Hard-coded upper limit
        {
            cout<<i<<"Do something in parallel (Static function)."<<endl;
            boost::this_thread::yield(); // 'yield' discussed in section 18.6
        }
    }

    // Operator() called by the thread
    void operator () ()
    {
        for (int i=0; i<m_iterations; i++)
        {
            cout<<i<<" - Do something in parallel (operator() )."<<endl;
            boost::this_thread::yield(); // 'yield' discussed in section 18.6
        }
    }

};

これはどのようにして呼び出し可能なオブジェクトになりますか? 演算子がオーバーロードされているか、コンストラクターか何かが原因ですか?

4

7 に答える 7

25

object()呼び出し可能なオブジェクトは、関数のようにorの構文で呼び出すことができるものobject(args)です。つまり、関数ポインター、または をオーバーロードするクラス型のオブジェクトですoperator()

クラスのオーバーロードによりoperator()、呼び出し可能になります。

于 2013-10-09T17:14:38.790 に答える
1

Function object add member function pointers は、呼び出し可能オブジェクトと呼ばれるものを生成します。C++ 98/03 では、クラスを使用して operator() を関数としてオーバーライドします。一般に、そのクラスの関数を呼び出します。関数の状態を保存できるという利点があり、他の関数はできません。最も重要な概念。 そして境界、このスタイル クラス関数と他の c スタイル関数および c スタイル関数へのポインターを "関数オブジェクト" と呼びます。呼び出し可能なオブジェクトは、単に「呼び出し可能な」オブジェクトです。これには、関数オブジェクトとメンバー関数ポインターが含まれます。

于 2016-01-08T01:53:34.380 に答える