C++ 与成员函数异步
我有一个密码:C++ 与成员函数异步,c++,c++11,asynchronous,C++,C++11,Asynchronous,我有一个密码: class cabc{ public: void pr() { cout<<"abcdef"; } }; int main() { cabc cap; auto f = async(cap.pr); f.get(); return 0; } 这是有效的。但是为什么第一种方法不起作用呢?请查看async的函数签名: template< class Function, class... Ar
class cabc{
public:
void pr()
{
cout<<"abcdef";
}
};
int main()
{
cabc cap;
auto f = async(cap.pr);
f.get();
return 0;
}
这是有效的。但是为什么第一种方法不起作用呢?请查看
async
的函数签名:
template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type>
async( Function&& f, Args&&... args );
模板<类函数,类。。。Args>
未来
异步(函数和函数、参数和…参数);
(来自)
显然,首先,无论函数&&
是什么,都不可能cap.pr
和&cabc::pr
都是这种类型
更准确地说,函数&
应该是对函数指针的右值引用&cabc::pr
只是指向成员函数的指针的语法,因为它是成员函数,所以指向对象本身的指针必须是第一个参数。如果cap.pr
是一个C风格的函数指针,那么您的第一个示例可能会起作用
老实说,我不确定第二个示例为什么有效,因为您没有传递指向对象的指针
类似的问题还有很多其他答案。例如:
cap.pr
是一个不完整的成员函数调用表达式。您必须使用包含适当函数参数的括号来生成有效的C++表达式。
因此,您不能将cap.pr
传递给std::async
或任何其他函数
要将成员函数传递给std::async
,需要使用找到的语法:
auto f=std::async(&capc::pr,cap);
尽管在这种情况下,您需要知道cap
对象是复制的。你也可以使用
auto f=std::async(&capc::pr,&cap);
只需将指针传递到cap
如果指向成员函数语法的指针不受欢迎,则可以使用lambda:
auto f=std::async([&]{cap.pr();});
这是不完全相同的:它不传递成员函数指针和对象指针到
std::async
,而是传递一个包含对cap
的引用的lambda对象,该对象直接调用其pr
成员函数。但是,结果基本上是一样的。为什么您希望第一种方法可以工作?这不仅仅是async
,而是语言的工作方式(或不工作)。cap.pr的功能与常规方法类似。那为什么它不应该起作用呢@juanchopanzaNo,cap.pr
不是一个函数cap.pr(arg)
的意思是“调用cabc::pr
oncap
并带有参数arg
”<代码> CAP.PR/<代码>本身没有意义。C++中应该有一个核心语言中的“绑定成员函数指针”的概念,因为很多人都直觉地认为你想使用的语法应该工作。然而,事实并非如此,将特性添加到现有类型系统并不是一件小事。另一方面,在库级很容易模拟它——它被称为std::mem\u fn
,它被std::async
内部使用,以使async(&a::b,c)
语法工作。很好——我没有想到在那里使用lambda。
auto f=std::async([&]{cap.pr();});