如何在类初始化时绑定std::bind以调用指定类实例的成员函数
解决方案
问题核心
希望在类初始化阶段完成std::bind操作,避免运行时重复绑定带来的性能开销,最终实现通过已绑定函数处理任意传入的目标类实例。
修正后完整代码
#include <vector> #include <functional> // 前向声明 class House; class HousesManager { public: std::vector<House> houseList; protected: // 明确绑定后函数的类型:接收House引用和float值,无返回 std::function<void(House&, float)> boundHousesAppreciateMethod; void appreciateTheHouse(House& theHouseInQuestion, float theAmount); }; class House { public: float value; protected: void appreciate(float increasedValue); // 声明HousesManager为友元,使其能访问protected成员函数 friend class HousesManager; }; // House类成员函数实现 void House::appreciate(float increasedValue) { value += increasedValue; } // HousesManager构造函数:仅初始化时绑定一次 HousesManager::HousesManager() { // 绑定House::appreciate,用占位符预留实例和数值参数位置 boundHousesAppreciateMethod = std::bind(&House::appreciate, std::placeholders::_1, std::placeholders::_2); } // 调用已绑定函数处理指定House实例 void HousesManager::appreciateTheHouse(House& theHouseInQuestion, float theAmount) { boundHousesAppreciateMethod(theHouseInQuestion, theAmount); }
关键说明
- 语法修正:补全原代码中缺失的函数参数声明、类定义分号、构造函数正确写法等语法错误。
- 权限处理:由于
House::appreciate是protected成员,通过给HousesManager添加友元声明,确保其能合法调用该函数;若允许将appreciate设为public,可省略友元声明。 - 绑定逻辑:构造函数中使用
std::placeholders::_1和std::placeholders::_2预留参数位置,使绑定后的函数可以接收任意House实例和增加值,满足“处理传入的特定类实例”的需求。 - 性能优化:绑定操作仅在
HousesManager初始化时执行一次,避免了运行时重复调用std::bind带来的资源消耗。
内容的提问来源于stack exchange,提问作者DSiegmeyer
相关产品推荐
相关产品推荐

