boost::variant存储两种boost::function是否可行,如何调用a_pFunc参数
问题解答
1. 成员函数合法性判断
你给出的ChangeWorking成员函数签名本身是合法的,但你附带的类型判断代码存在严重错误:
- 你代码中出现的
a_pFuncContainer变量未在上下文中定义,你要处理的对象应该是入参a_pFunc - 你对
boost::variant的类型判断完全错误:该variant的两个可选类型是boost::function<CPamWorkingPtr(CPamWorking*)>和boost::function<void(CPamWorking*)>,不是CPamWorkingPtr或void,boost::get<void>的写法完全不合法。
2. a_pFunc参数的正确调用方式
a_pFunc可以接收两类可调用对象:返回CPamWorkingPtr且入参为CPamWorking*的对象,或者返回void且入参为CPamWorking*的对象,以下是两种场景的调用示例:
场景1:传入返回CPamWorkingPtr的可调用对象
// 示例普通函数 CPamWorkingPtr TestFuncReturnPtr(CPamWorking* pWork) { // 自定义逻辑 return CPamWorkingPtr(pWork); } // 调用ChangeWorking CElmWorkingPropertyList obj; obj.ChangeWorking(&TestFuncReturnPtr, false); // 也可以直接传入lambda obj.ChangeWorking([](CPamWorking* pWork) -> CPamWorkingPtr { // 自定义逻辑 return {}; }, true);
场景2:传入返回void的可调用对象
// 示例普通函数 void TestFuncReturnVoid(CPamWorking* pWork) { // 自定义逻辑 pWork->DoSomething(); } // 调用ChangeWorking obj.ChangeWorking(&TestFuncReturnVoid, false); // 也可以直接传入lambda obj.ChangeWorking([](CPamWorking* pWork) { // 自定义逻辑 }, true);
3. 函数内部处理a_pFunc的正确写法
方式1:手动判断类型(不推荐,容易写错)
// 先定义类型别名方便使用 using FuncWithReturn = boost::function<CPamWorkingPtr(CPamWorking*)>; using FuncWithoutReturn = boost::function<void(CPamWorking*)>; // 假设你已经获取到要传入回调的CPamWorking*实例pWorkInstance CPamWorkingPtr pWork; if (a_pFunc.type() == typeid(FuncWithReturn)) { pWork = boost::get<FuncWithReturn>(a_pFunc)(pWorkInstance); // 后续处理pWork的逻辑 } else { boost::get<FuncWithoutReturn>(a_pFunc)(pWorkInstance); }
方式2:使用访问者模式(推荐,类型安全)
用boost::static_visitor处理variant,编译期就能校验类型处理的完整性,避免运行期类型判断错误:
class FuncVisitor : public boost::static_visitor<> { public: explicit FuncVisitor(CPamWorking* pWork) : m_pWork(pWork) {} // 处理带返回值的函数 void operator()(const FuncWithReturn& func) const { CPamWorkingPtr res = func(m_pWork); // 后续处理res的逻辑 } // 处理无返回值的函数 void operator()(const FuncWithoutReturn& func) const { func(m_pWork); } private: CPamWorking* m_pWork; }; // 调用访问者处理a_pFunc boost::apply_visitor(FuncVisitor(pWorkInstance), a_pFunc);
内容的提问来源于stack exchange,提问作者SchluppIng
相关产品推荐
相关产品推荐

