结合变长模板,auto推导及完美转发的概念可以实现函数的装饰器功能:
#include <iostream>
using namespace std;
template<class Fn, class ...Args>
decltype(auto) func_wrap(Fn&& fn, Args&&... args)
{
printf("func call begin\n");
auto ret = forward<decltype(fn)>(fn)(forward<decltype(args)>(args)...);
printf("func call end\n");
return ret;
}
int add(int a, int b)
{
int ret = a + b;
cout<<a<<"+"<<b<<"="<<ret<<endl;
return a+b;
}
int main ()
{
func_wrap(printf, "%s %s\n", "hi", "world");
cout<<endl;
func_wrap(add, 1, 2);
return 0;
}
运行程序输出:
func call begin
hi world
func call end
func call begin
1+2=3
func call end