普通函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <utility> #include <iostream> template <typename Fn, Fn fn, typename ... Args>void func_wraper (Args... args) { std::cout << "hello, " ; fn (std::forward<Args>(args)...); std::cout << " bye." ; } #define WRAPER(FUNC) func_wraper<decltype(&FUNC), &FUNC> void func_a (int i) { std::cout<<"func_a(" <<i<<")" ; } int main () { WRAPER (func_a)(int (0 )); return 0 ; }
输出
成员函数
在函数指针的使用上有区别,还有更多的类型,例如包装成员函数在类外使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include <utility> #include <iostream> class MyClass {public : typedef MyClass self; template <typename Fn, Fn fn, typename ... Args> void memberfunc_wrap_in_memberfunc (Args... args) { std::cout << "hello, " ; (*this .*fn)(std::forward<Args>(args)...); std::cout << " bye." ; } void memberfunc_a (int i) { std::cout<<"memberfunc_a(" <<i<<")" ; } #define WRAPER(FUNC) memberfunc_wrap_in_memberfunc<decltype(&self::FUNC), &self::FUNC> void wrap_a (int i) { WRAPER (memberfunc_a)(i); } }; template <typename Fn, Fn fn, typename ClassA,typename ... Args>void wrap_memberfunc (ClassA* A, Args... args) { std::cout << "hello, " ; (*A.*fn)(std::forward<Args>(args)...); std::cout << " bye." ; } int main () { MyClass a; a.memberfunc_wrap_in_memberfunc <void (MyClass::*)(int ), &MyClass::memberfunc_a>(int (1 )); std::cout << std::endl; a.wrap_a (int (2 )); std::cout << std::endl; wrap_memberfunc <decltype (&MyClass::memberfunc_a) ,&MyClass::memberfunc_a>(&a, int (3 )); return 0 ; }
输出
1 2 3 hello, memberfunc_a(1) bye . hello, memberfunc_a(2) bye . hello, memberfunc_a(3) bye .