函数包装模板

普通函数

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)
{
/*do some thing*/
std::cout << "hello, ";

fn(std::forward<Args>(args)...);

/*do some thing*/
std::cout << " bye.";
}

#define WRAPER(FUNC) func_wraper<decltype(&FUNC), &FUNC>

void func_a(int i){
/*do some thing*/ std::cout<<"func_a("<<i<<")";
}
int main(){
WRAPER(func_a)(int(0));
return 0;
}

输出

1
hello, func_a(0) bye.

成员函数

在函数指针的使用上有区别,还有更多的类型,例如包装成员函数在类外使用

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;

// declear and use in class
template<typename Fn, Fn fn, typename... Args>
void memberfunc_wrap_in_memberfunc(Args... args)
{
/*do some thing*/
std::cout << "hello, ";

(*this.*fn)(std::forward<Args>(args)...);

/*do some thing*/
std::cout << " bye.";
}

void memberfunc_a(int i)
{
/*do some thing*/ 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){
/*do some thing*/
std::cout << "hello, ";

(*A.*fn)(std::forward<Args>(args)...);

/*do some thing*/
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.