我可能有点密集,但无法理解下面的行是什么?
class background_task
{
public:
void operator()() const
{
do_something();
do_something_else();
}
};
background_task f;
std::thread my_thread(f);
我意识到创建了一个调用类my_thread
的对象f
的线程(名为background_task
),但是什么时候是类{{1}中的函数operator()
实际上被称为?
为什么需要重载函数运算符?
我理解这是C ++ 101或非常基础,但我仍然无法掌握它,所以我应该参考哪些书籍以便更多地了解C ++的这些主题。
答案 0 :(得分:2)
operator()()
class background_task
{
public:
void operator()() const
{
do_something();
do_something_else();
}
};
意味着你可以实例化一个background_task并调用它(在这种情况下没有任何参数)。这使它成为“可调用的实体”:
background_task f;
f(); // calls foo::operator ()(), i.e calls do_something() and do_something_else().
对于线程,它需要一个不带参数的可调用实体,所以传递一个background_task
的实例就可以了。如果background_task
不可调用,则以下内容无法编译:
background_task f;
std::thread my_thread(f);
std::thread
构造函数还允许您传递可调用实体的参数(如果它具有参数),例如
class background_task
{
public:
void operator()(double x) const
{
// do something with x, if you want
do_something();
do_something_else();
}
};
可以使用
background_task f;
std::thread my_thread(f, 3.1416);
在内部,该线程将相当于调用f(3.1416)。
编辑:最初我声称没有涉及超载。这还不完全清楚所以我改写了我的答案。
答案 1 :(得分:1)
线程对象std::thread(f, a, b, c)
复制对象f
(让我们称之为copy_of_f
),新执行上下文的入口点是调用{{ 1}}(或更详细地说,copy_of_f(a, b, c)
)。
对象copy_of_f.operator()(a, b, c)
必须是可调用实体,这意味着表达式f
必须有意义。
专门针对C ++ 11的书籍仍处于编写过程中。今年晚些时候,请关注Stroustrup,Meyers和其他人。到那时,互联网可能是你最好的选择。