考虑这段代码:
#include <functional>
class A{
public:
std::function<void(A* obj)> todo;
void doWork(){
if(todo)
todo(this);
}
private:
void dummy(){}
friend void todo(); // not working
};
int main(int argc, char *argv[])
{
A tmp;
tmp.todo = [](A *obj){
obj->dummy();
};
tmp.doWork();
return 0;
}
当然,我们无法构建此代码,因为 'A::dummy': 无法访问类 'A' 中声明的私有(private)成员
。
我认为这是不可能的,但是有没有办法从 lambda 声明访问 A 类的私有(private)成员??
最佳答案
friend void todo(); // not working
是的,它不起作用。这声明友元函数是某个名为“todo”的函数。
这与同名类成员不同。友元是函数(或类),而不是类成员。
您在这里面临的基本问题是两个基本 C++ 方面的组合:
std::function<something>
是一个具体的、独立的类。每个 lambda 都是一个匿名类,所有 lambda 都是离散的、不同的匿名类。
你可以这样声明:
friend class std::function<void(A* obj)>;
但这不会取得任何成果。这将允许 std::function
模板本身来访问此类的私有(private)成员。因此,如果您的 C++ 库的 std::function
的内部实现中存在某些内容模板需要访问一个私有(private)类成员,它现在可以做到这一点。但是,当然,std::function
中什么也没有。本身对您的类(class)有任何了解。
并且由于每个 lambda 本身都是一个离散的匿名类,这对任何 lambda 都没有影响。 std::function
对于这些匿名 lambda,它本身是它自己的一个具体类,它影响类型删除。
简而言之,这在C++中是做不到的。您真正想要的是将特定的匿名 lambda 类设为 friend
这个类的。但是C++中没有这样的语法。您必须想出一些其他替代策略,让您的 lambda 可以访问您类(class)的私有(private)成员。
关于c++ - std::function 作为类的友元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63873049/