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

如何编写支持延迟执行函数及参数的C++ Delayed类?

实现C++延迟执行类Delayed的完整方案

你已经搭好了Delayed类的基础框架,不过还缺核心的延迟执行逻辑,另外还有些细节可以优化(比如让模板参数自动推导,不用手动指定)。下面是完整的实现方案:

完整代码实现

#include <functional>
#include <tuple>
#include <utility>
#include <iostream>
#include <string>

// 延迟执行类:存储函数和参数,在需要时触发执行
template<typename Func, typename... Args>
class Delayed {
public:
    // 构造函数:完美转发函数与参数,保留原始值属性(左值/右值)
    Delayed(Func&& func, Args&&... args)
        : m_func(std::forward<Func>(func)),
          m_args(std::forward<Args>(args)...) {}

    // 核心执行方法:调用存储的函数并返回结果
    auto execute() -> decltype(auto) {
        // 用std::apply把tuple中的参数展开,传递给目标函数
        return std::apply(m_func, m_args);
    }

private:
    Func m_func;
    std::tuple<Args...> m_args;
};

// 推导指引:让编译器自动推导模板参数,简化对象创建
template<typename Func, typename... Args>
Delayed(Func&&, Args&&...) -> Delayed<Func, Args...>;

// 测试示例
int main() {
    // 示例1:Lambda表达式的延迟执行
    auto add = [](int a, int b) { return a + b; };
    Delayed delayed_add(add, 3, 5);
    int sum = delayed_add.execute(); // sum = 8

    // 示例2:普通函数的延迟执行
    double multiply(double x, double y) { return x * y; }
    Delayed delayed_mult(multiply, 2.5, 4.0);
    double product = delayed_mult.execute(); // product = 10.0

    // 示例3:无返回值函数的延迟执行
    Delayed delayed_print([](const std::string& msg) {
        std::cout << msg << std::endl;
    }, "Hello, Delayed Execution!");
    delayed_print.execute(); // 输出指定字符串

    return 0;
}

关键细节说明

  • 完美转发:构造函数中用std::forward保留参数的原始值类型,避免不必要的拷贝,对大型对象或仅支持移动的类型特别友好。
  • std::apply的作用:C++17引入的std::apply可以把std::tuple中的元素展开为函数的参数列表,完美解决了可变参数存储后如何传递给函数的问题。
  • 推导指引:添加推导指引后,创建Delayed对象时不需要手动写复杂的模板参数(比如Delayed<decltype(add), int, int>),编译器会自动推导,使用更简洁。
  • 返回值适配:execute()用decltype(auto)自动推导返回值类型,不管原函数返回值、引用还是void都能正确处理。

针对你原有代码的调整说明

你的原有代码用std::function封装函数是可行的,但上面的实现直接存储原始函数类型(lambda、函数指针等),避免了std::function的额外开销,同时兼容性更强。如果一定要保留std::function的写法,也可以修改模板参数为typename R, typename... Args,成员变量用std::function<R(Args...)>,只是自动推导会麻烦一些,推荐上面更灵活的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:51:06