C++ void运算符()的功能()

C++ void运算符()的功能(),c++,C++,我对void operator()()的功能感到困惑 你能告诉我这方面的情况吗,例如: class background_task { public: void operator()() const { do_something(); do_something_else(); } }; background_task f; std::thread my_thread(f); 这里,我们为什么需要操作符()()?第一个和第二个()的含

我对
void operator()()
的功能感到困惑

你能告诉我这方面的情况吗,例如:

class background_task
{
public:

    void operator()() const
    {
        do_something();
        do_something_else();
    }
};

background_task f;

std::thread my_thread(f);
这里,我们为什么需要
操作符()()
?第一个和第二个
()
的含义是什么?实际上,我知道普通操作符的操作,但是这个操作符很容易混淆。

第一个
()
是操作符的名称-在对象上使用
()
时调用的操作符。第二个
()
用于参数,其中没有参数

下面是一个如何使用它的示例:

background_task task;
task();  // calls background_task::operator()

您可以重载
()
操作符来调用对象,就像调用函数一样:

class A {
public:
    void operator()(int x, int y) {
        // Do something
    }
};

A x;
x(5, 3); // at this point operator () gets called
因此,第一个括号总是空的:这是函数名:
operator()
,第二个括号可能有参数(如我的示例所示),但它们不一定有参数(如您的示例所示)


因此,要在特定情况下调用此运算符,您可以执行类似于
task()

的操作。第一部分
operator()
是将类的实例作为函数调用时调用的函数声明的方法。第二对括号将包含实际参数

对于返回值和参数,这可能更有意义:

class Adder{
public:
int operator()(int a, int b){
    //operator() -- this is the "name" of the operator
    //         in this case, it takes two integer arguments.
    return a+b;
}
};
Adder a;
assert( 5==a(2,3) );

在此上下文中,
std::thread
将在线程内部调用
f()
,即
operator()
主体内的任何内容都是在该线程内完成的。

以上提供的所有提示对于顺序程序都是正确的,我的意思是,没有线程的程序。使用线程,情况会发生变化。 首先,std::thread的默认参数是函数和函数参数。可能您正在学习《C++并发操作》一书,作者给出了一个有趣的例子:

void do_some_work(); 
thread my_thread(do_some_work); //thread receives the function address
假设此函数:

无效做其他工作(INTK); 在代码主体中,您应该执行以下操作:

k=3; 
thread my_thread2(do_other_job, k); 
以生成另一个线程

因此,使用线程,编译器在默认情况下将f(在std::thread my_thread(f);中)解释为函数而不是类。若要更改,您必须启动一个运算符()来警告编译器您正在使用一个类。 另一种代码可以是:

class background_task{
public: 
background_task(){
 do_sth(); 
 do_sth_else(); 
 }
void operator()(){} 
}; 
background_task f; 
thread mythread10(f);
最终,它是不正确的,使用线程,为操作符提供信息,因此此代码不起作用:

void operator()(int x){
do_sth(); 
cout<<"x = "<<x<<endl;
}
将在没有错误的情况下运行,并将在生成的线程中执行函数do_sth(12)


我希望我帮了忙

运算符()仅在没有任何参数的情况下调用?还有其他情况可以运行吗?@forester2012,您可以通过在第二个
()
中声明参数来选择有多少个参数,如下所示。您也可以声明不同的参数< >代码>(或代码>函数),这些函数具有不同的参数列表,C++将根据调用时使用的参数选择正确的函数。非常感谢。除了此显式调用task(),是否还有对操作符()的隐式调用?@forester2012,没有。您必须始终显式调用它,尽管您也可以使用更为笨拙的
task.operator()
语法。有许多标准算法会在内部调用此运算符。顺便问一下,整个
运算符()()
是否有名称?@J.Doe我不知道运算符的名称,但有时实现此方法的类称为“functor”,因为它像函数一样运行。
class backg{
public: 
backg(int i){
   do_sth(i); 
   }
void operator()(){}
}; 
int main(){
thread mythread{ backg(12) }; //using c++11
return 0; 
}