2013-10-09 2 views
9

В настоящее время я изучаю потоки повышения. И я наткнулся на то, что класс потока имеет конструктор, который принимает вызываемые объекты. Что такое вызываемые объекты?Что такое вызываемый объект в C++?

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 
     } 
    } 

}; 

Как это становится вызываемым объектом? Это из-за перегрузки оператора или конструктора или чего-то еще?

+1

Это потому, что 'operator()', да. См. [Здесь] (http://stackoverflow.com/questions/356950/c-functors-and-their-uses). Кроме того, «вызываемые объекты» в этом контексте также являются функциями, указателями функций и лямбда-функциями. – jrok

+0

Это перегруженный 'operator()'. Он позволяет вызывать экземпляр этого класса как функцию. Они называются * functors *, * объектами функции *, * вызываемыми объектами * и т. Д. – Simple

+1

Вы должны пометить (и назвать) этот вопрос с помощью boost. Boost - это не стандартная библиотека C++, поэтому очень большое сообщество поддержки здесь может быстрее поднять это значение, если вы отметили его и назвали правильно. – Xoorath

ответ

3

Объект, который имеет по крайней мере перегруженный operator() является callable object, и что оператор плюс его объект может быть вызван как функции призыв:

CallableClass obj; 
obj(); 
+0

Я думаю, что «вызываемый объект» имеет более широкое определение, чем просто это, но я не могу найти ссылку. Разумеется, класс с 'operator()' * является * вызываемым объектом - я просто не certian, это правда. –

+0

@JohnDibling: Да, и я сказал «Объект ... _is_ вызываемый объект» не в обратном порядке. – deepmax

+0

@JohnDibling - вы правы: «вызываемый объект» содержит указатель на элемент.Вещи, которые можно вызвать с помощью списка аргументов в скобках, являются объектами функции. –

8

вызываемого объектом является то, что можно назвать как у с синтаксисом object() или object(args); то есть указатель на функцию или объект типа класса, который перегружает operator().

Перегрузка operator() в вашем классе делает ее пригодной для использования.

1

отзывной объект является экземпляром объекта из класса с operator() перегруженного:

struct Functor { 
    ret_t operator()(); 
    // ... 
} 

Functor func; // func is a callable object 

или разыменованных-указатель функции:

ret_t func() { 
    // ... 
} 

func; // func converts to a callable object 
+0

_ «Функция не является объектом ... (§1.8/1)» _ – deepmax

+0

@MM: Именно поэтому ответ говорит «указатель функции *», а не «функция». Возможно, комментарий кода может быть более точным, например. «func преобразуется в вызываемый объект». –

+0

@MikeSeymour изменил комментарий, если быть точным, спасибо –

3

Есть два шага здесь. В стандарте C++ «функциональный объект» - это объект, который может отображаться в левой части списка аргументов в скобках, то есть указатель на функцию или объект, тип которого имеет один или несколько operator() s. Термин «вызываемый объект» является более широким: он также содержит указатели на члены (которые нельзя вызвать с помощью синтаксиса нормальных функций). Вызываемые объекты - это вещи, которые могут быть переданы в std::bind и т. Д. См. 20.8.1 [func.def] и 20.8 [function.objects]/1.

0

Функциональный указатель функции функции указывает, что называется вызываемыми объектами. Когда мы в C++ 98/03, мы используем класс, переопределяем оператор() как функцию. В общем, мы называем эту функцию класса. У него есть преимущество хранения состояния функции и другой функции can't. самую важную концепцию. И границу мы называем этой функцией класса стиля и другой функцией стиля c и указателем на функцию стиля c «объект функции». Вызываемый объект является просто «вызываемым» объектом. Он включает в себя функции-объекты и указатели функций-членов.

Смежные вопросы