You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:00