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

非模板类CFnSaver如何保存任意返回类型的函数及参数?

问题:创建可保存函数指针、参数及返回类型的类

需求说明

我想要创建一个类来保存函数指针、参数以及返回类型。当前实现中返回类型被硬编码为int,且因为需要创建std::vector<CFnSaver*>数组,无法直接使用模板类,希望找到合适的实现方式。

当前实现的函数保存类

// 此处无法使用模板,因为下一步我要创建CFnSaver的数组('std::vector<CFnSaver*>')
// template<typename T>
class CFnSaver
{
public:
    // 此处不能使用模板,编译器会报错
    // template<typename T>
    std::function<int()> savedFn;

    template<typename ... Args>
    constexpr bool Save(void* pFn, Args ... args)
    {
        if (!pFn) return false;

        // 创建Lambda函数
        auto lambdaFn = [pFn, args...]()
        {
            // 我需要获取函数的返回类型,而不是像现在这样硬编码为'int'
            using tempFn = int(*)(Args ...);
            auto tempFunc = reinterpret_cast<tempFn>(pFn);
            return tempFunc(args...);
        };

        // 这里可以调用原函数并获取结果,例如'5',但我现在不需要
        // auto res = lambdaFn(); 

        // 将Lambda保存到std::function中
        savedFn = lambdaFn;

        return !!savedFn;
    }


    inline CFnSaver() {};

    template<typename ... Args>
    inline CFnSaver(void* pFn, Args ... args) { Save(pFn, args...); }

    bool const operator ! () const { return(!savedFn); }

    explicit operator bool() const { return !!savedFn; }
};

使用示例

int printSum(int a, int b)
{
    int sum = a + b;
    printf_s("%d\n", sum);
    return sum;
}

int main()
{
    CFnSaver cfn(printSum, 2, 3);

    // 我需要获取该函数的返回值(现在被硬编码为int)
    auto res = cfn.savedFn();

    return 0;
}

不满意的替代方案

我尝试过通过引用传递变量获取结果,但这个方案并不理想:

void printSum(int a, int b, int& result)
{
    int sum = a + b;
    printf_s("%d\n", sum);
    result = sum;
}

int main()
{
    int result = 0;
    CFnSaver cfn(printSum, 2, 3, result);
    cfn.savedFn();

    return 0;
}

已尝试的方法

  • 模板类(但无法用于创建统一的数组)
  • 模板函数
  • 引用传参

希望得到帮助,找到能保存任意返回类型函数的实现方式。


内容的提问来源于stack exchange,提问作者Jaja Jeje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:31