2

我可能有点密集,但不明白下面的行是做什么的?

class background_task
{
  public:
    void operator()() const
    {
      do_something();
      do_something_else();
    }
};

background_task f;
std::thread my_thread(f);
  1. 我意识到创建了一个调用类my_thread对象的线程(名为),但是什么时候真正调用了类中的函数?fbackground_taskoperator()background_task

  2. 为什么需要函数运算符的重载?

  3. 我知道这是 C++ 101 或非常基本的,但我仍然无法掌握它,所以我应该参考哪些书籍才能了解更多关于 C++ 的此类主题。

4

2 回答 2

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().

至于线程,它需要一个不带参数的可调用实体,因此向它传递 a 的实例就可以了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)。

编辑:最初我声称没有涉及超载。这还不完全清楚,所以我改写了我的答案。

于 2012-04-11T17:41:39.397 回答
1
  1. 线程对象std::thread(f, a, b, c)制作对象的副本f(我们称之为copy_of_f),新执行上下文的入口点是调用copy_of_f(a, b, c)(或更详细地说,copy_of_f.operator()(a, b, c))。

  2. 对象f必须是可调用实体,这意味着表达式f(a, b, c)必须有意义。

  3. 专门针对 C++11 的书籍仍在编写中。今年晚些时候,请留意 Stroustrup、Meyers 和其他人。到那时,互联网可能是你最好的选择。

于 2012-04-11T18:11:01.703 回答