C++ 从类外部调用lambda中的私有函数
在我当前的项目中,我试图将一个私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是另一个类的成员函数,但为了保持简单,这里它是一个自由函数C++ 从类外部调用lambda中的私有函数,c++,c++11,lambda,this,C++,C++11,Lambda,This,在我当前的项目中,我试图将一个私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是另一个类的成员函数,但为了保持简单,这里它是一个自由函数 void outside_function(std::function<void(int)> func) { // do something with func } class MyClass { public: void run(); private: bool my_func(double); // define
void outside_function(std::function<void(int)> func) {
// do something with func
}
class MyClass {
public:
void run();
private:
bool my_func(double); // defined in source file
};
为什么这样做有效?就我的理解而言,outside\u function
无权访问my\u func
。为什么我不先公开我的功能?是编译器做的事情还是C++规则我不知道?
此外,这种方法是否有可能破坏我的代码?
private
访问说明符仅限制对象名称在类外可见(无法查找)。对象本身与任何其他成员一样
类的成员可以是
(1.1)私人;也就是说,它的名称只能由声明它的类的成员和朋友使用
(1.2)受保护;也就是说,它的名称只能由声明它的类的成员和朋友、从该类派生的类及其朋友使用(请参见[class.protected])
(1.3)公众;也就是说,它的名称可以在任何地方使用,而不受访问限制
outside_函数
从不访问成员(它只知道func
参数的类型,不可能关心它是如何定义的)——只有lambda函数可以访问
由于在MyClass
中定义lambda函数,因此可以访问其中的所有私有名称
outside\u function
调用提供的函数,但如果不允许调用使用任何私有成员的函数,则无法执行太多操作。好的,我明白了。我的误解可能是认为lambda是MyClass
之外的东西。谢谢@KorbenDose lambda表达式返回在当前作用域中定义的函数对象(由捕获列表管理)。因此,它可以访问该范围内可访问的任何内容。这相当于声明和创建一个类实例,该类将使用该范围中的值或\和引用进行初始化,并定义了operator()
。
void MyClass::run() {
outside_function([this](int a) -> void {
double d = static_cast<double>(a);
this->my_func(d);
});
}