类似于Python的C ++装饰器

类似于Python的C ++装饰器,第1张

类似于Python的C ++装饰器

std::function

提供了我提出的解决方案的大多数构建块。

这是我建议的解决方案

#include <iostream>#include <functional>//-------------------------------// BEGIN decorator implementation//-------------------------------template <class> struct Decorator;template <class R, class... Args>struct Decorator<R(Args ...)>{   Decorator(std::function<R(Args ...)> f) : f_(f) {}   R operator()(Args ... args)   {      std::cout << "Calling the decorated function.n";      return f_(args...);   }   std::function<R(Args ...)> f_;};template<class R, class... Args>Decorator<R(Args...)> makeDecorator(R (*f)(Args ...)){   return Decorator<R(Args...)>(std::function<R(Args...)>(f));}//-------------------------------// END decorator implementation//-------------------------------//-------------------------------// Sample functions to decorate.//-------------------------------// Proposed solution doesn't work with default values.// int decorated1(int a, float b = 0)int decorated1(int a, float b){   std::cout << "a = " << a << ", b = " << b << std::endl;   return 0;}void decorated2(int a){   std::cout << "a = " << a << std::endl;}int main(){   auto method1 = makeDecorator(decorated1);   method1(10, 30.3);   auto method2 = makeDecorator(decorated2);   method2(10);}

输出:

Calling the decorated function.a = 10, b = 30.3Calling the decorated function.a = 10

ps

Decorator
提供了一个可以进行功能调用以外的其他功能的地方。如果您想简单地传递至
std::function
,可以使用:

template<class R, class... Args >std::function<R(Args...)> makeDecorator(R (*f)(Args ...)){   return std::function<R(Args...)>(f);}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5654252.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存