如何编写支持延迟执行函数及参数的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
相关产品推荐
相关产品推荐

