我目前正在研究boost线程。我发现线程类有一个接受可调用对象的构造函数。什么是可调用对象?
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
}
}
};
它是如何变成一个可调用对象的?是因为运算符重载了还是构造函数或者其他什么原因?
7条答案
按热度按时间yyyllmsg1#
可调用对象是可以像函数一样调用的对象,语法为
object()
或object(args)
;即函数指针或重载operator()
的类类型的对象。类中
operator()
的重载使其可调用。j9per5c42#
这里有两个步骤。在C++标准中,“函数对象”是可以出现在带括号的参数列表左侧的对象,即指向函数的指针或类型具有一个或多个
operator()
的对象。术语“可调用对象”更广泛:它还包括指向成员的指针(不能用普通函数调用语法调用)。可调用对象是可以传递给std::bind
等的对象。参见20.8.1 [func.def]和20.8[function.objects]/1。iaqfqrcu3#
可调用对象是
operator()
重载的类的对象示例:或一个被取消引用的函数指针:
vh0rcniy4#
一个至少有一个重载
operator()
的对象是一个可调用对象,并且这个操作符加上它的对象可以像调用函数一样被调用:7gyucuyw5#
在C++11中,可调用元素可以是:
这意味着你可以使用上面提到的每一个可调用元素来启动一个std::thread。
9nvpjoqh6#
从C++17开始,Callable对象由标准定义;有关详细信息,请参见https://en.cppreference.com/w/cpp/named_req/Callable。
cs7cruho7#
函数对象添加成员函数指针产生了可调用对象。当我们在c++ 98/03中使用类重写操作符时()作为函数。一般我们称之为类函数。它具有存储函数状态的优点,而其他函数不能。因此它是最重要的概念。而边界,我们称这种风格的类函数和其他的c风格函数以及指向c风格函数的指针为“函数对象”。2可调用对象就是“可调用”对象。3它包括函数对象和成员函数指针。