ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
```cpp #include <iostream> #include <functional> #include <type_traits> /** * 命令模式的作用是将请求封装为一个对象,将请求的发起者和执行者解锁, * 支持对请求排队、撤销和重做。 */ template <class F, class... Args, class = typename std::enable_if<!std::is_member_function_pointer<F>::value>::type> void Wrap(F&& f, Args&& ...args) { return f(std::forward<Args>(args)...); } /** * 接受成员函数的包装器 */ template <class R, class C, class... DArgs, class P, class... Args> void Wrap(R(C::*f)(DArgs...), P&& p, Args&& ...args) { return (*p.*f)(std::forward<Args>(args)...); } template <typename R=void> struct CommCommand { private: std::function<R()> func; public: /** * 接受function、函数对象、lamda和普通函数的包装器 */ template <class F, class... Args, class = typename std::enable_if<!std::is_member_function_pointer<F>::value>::type> void Wrap(F&& f, Args&& ...args) { func = [&] { return f(args...); } } /** * 接受成员函数的包装器 */ template <class R, class C, class... DArgs, class P, class... Args> void Wrap(R(C::*f)(DArgs...), P&& p, Args&& ...args) { func = [&, f](*p.*f)(std::forward<Args>(args)...); } R Excecute() { return func(); } }; struct STA { int a; int operator()() { return a; } int operator()(int n) { return a + n; } int triple0() { return a * 3; } int triple(int n) { return a * 3 + n; } int triple1() { return a * 3; } const int triple2(int n) { return a * 3 + n; } void triple3() { std::cout << "" << std::endl; } }; int add_one(int n) { return n + 1; } void testWrap() { CommCommand<int> cmd; cmd.Wrap(add_one, 0); } int main(int argc, char** argv) { return 0; } ```