使用std::bind绑定多参数成员函数到std::function编译失败求助
问题分析:std::bind双参数绑定编译失败的原因
我尝试将一个双参数函数通过std::bind存储到另一个类的std::function中,但编译失败。单参数场景下代码可正常运行,改为双参数并使用占位符_2后出现问题。以下是最小复现代码:
存储类代码
#include <functional> #include <string> class StorageClass{ public: //在实际代码中,它会被传递到另一层,因此我使用引用而非值传递 void AddFunction(const std::function<void(std::string& a, int b)>& function); private: std::function<void(std::string& a, int b)> callBack; }; void StorageClass::AddFunction(const std::function<void(std::string& a, int b)>& function){ callBack = function; }
父类及主函数代码
class ParentClass { public: ParentClass(); void someFunction(std::string a, int b); private: StorageClass storageClass; }; ParentClass::ParentClass() { storageClass.AddFunction(std::bind(&ParentClass::someFunction, this, std::placeholders::_2)); } void ParentClass::someFunction(std::string a, int b) { }
int main() { ParentClass parentClass; }
错误原因
占位符数量不匹配:
ParentClass::someFunction是双参数函数,但你在std::bind中只提供了_2这一个占位符,绑定后的函数签名只能接收一个参数,而StorageClass要求的std::function需要接收两个参数(std::string&和int),签名不匹配直接导致编译失败。参数类型引用不匹配:
StorageClass中存储的std::function第一个参数是std::string&(引用),但someFunction的第一个参数是值传递std::string a。即使占位符问题解决,后续调用时如果传入临时字符串,可能会触发未定义行为,建议统一参数传递方式。
修正后的代码
将ParentClass构造函数中的std::bind补充完整占位符,同时根据需求调整参数传递方式:
ParentClass::ParentClass() { // 补充第一个参数的占位符_1,匹配双参数签名 storageClass.AddFunction(std::bind(&ParentClass::someFunction, this, std::placeholders::_1, std::placeholders::_2)); } // 如果需要严格匹配StorageClass的引用参数,修改someFunction的参数为引用 void ParentClass::someFunction(std::string& a, int b) { }
内容的提问来源于stack exchange,提问作者Natio2
相关产品推荐
相关产品推荐

