c++ - 从类外调用 lambda 中的私有函数
问题描述
在我当前的项目中,我试图将私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是不同类的成员函数,但为了简单起见,这里是一个自由函数。
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
};
现在,run
我想my_func
从内部outside_function
作为论据。由于 的签名run
不符合参数的要求,我不能简单地传递它。使用适配器模式是我的第一次尝试,当时我被提醒成员函数隐式地将this
指针作为第一个参数。这个答案建议使用 lambda 表达式,这就是我所做的。
void MyClass::run() {
outside_function([this](int a) -> void {
double d = static_cast<double>(a);
this->my_func(d);
});
}
为什么这行得通?从我的理解来看,outside_function
无法访问my_func
. 为什么我不必先my_func
公开?是编译器做的事情还是我不知道的一些 C++ 规则?
此外,这种方法是否有任何可能会破坏我的代码的问题?
解决方案
private
访问说明符仅将对象名称限制为在类外可见(无法查找)。对象本身就像任何其他成员一样。
[class.access]/1
一个类的成员可以是
(1.1) 私人的;也就是说,它的名称只能被声明它的类的成员和朋友使用。
(1.2) 受保护的;也就是说,它的名称只能由声明它的类的成员和朋友、从该类派生的类以及它们的朋友使用(参见 [class.protected])。
(1.3) 公开的;也就是说,它的名称可以在任何地方使用而不受访问限制。
推荐阅读
- powershell - Powershell 找到一个值并分配它
- c++ - 为什么 fwrite 向我抛出访问冲突?
- sql-server - MS Visual Studio 现有保存的 sql 文件无法从服务器资源管理器访问保存的数据库连接
- python-3.x - while循环和使用after重复调用函数的区别
- sql - Power BI NativeQuery - 无法从类型转换为文本
- scala - 迁移到 scala-js 1.1.1 时出现 scala-js“@JSGlobalScope”错误
- ruby-on-rails - STRIPE :此客户没有附加付款来源或默认付款方式。轨道上的红宝石
- codenameone - 需要你点亮 iOS 线程
- python - 使用逻辑回归的文本数据
- python - 用 NaN 替换数据框值