File: membercall.cpp

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (84 lines) | stat: -rw-r--r-- 1,362 bytes parent folder | download | duplicates (4)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <cstdio>
#include <cstring>

class Base {
public:
	size_t data;

	virtual ~Base() {}

	void regular() {
		printf("Regular Base\n");
	}

	virtual void dynamic() {
		printf("Dynamic Base\n");
	}

	virtual void dynamic2() {
		printf("Dynamic2 Base\n");
	}
};

class Derived : public Base {
public:
	void regular() {
		printf("Regular Derived\n");
	}

	virtual void dynamic() {
		printf("Dynamic Derived\n");
	}

	virtual void dynamic2() {
		printf("Dynamic2 Derived\n");
	}
};

typedef void (Base::*Fn)();

void doRegularCall(Base *m, Fn fn) {
	(m->*fn)();
}

void doPlainCall(Base *m, Fn fn) {
	typedef void (*Plain)(Base *);
	Plain plain;
	memcpy(&plain, &fn, sizeof(Plain));
	printf("Plain function: %p\n", plain);
	(*plain)(m);
}

void doCall(Base *m, Fn fn) {
	printf("Regular: ");
	doRegularCall(m, fn);
	// printf("Plain: ");
	// doPlainCall(m, fn);
}

void doCall(Base *m, void (Derived::*fn)()) {
	Fn f;
	memcpy(&f, &fn, sizeof(Fn));
	doCall(m, f);
}

int main() {
	printf("Size of fn pointer: %d\n", int(sizeof(Fn)));

	Base b;
	printf("-- base --\n");
	doCall(&b, &Base::regular);
	doCall(&b, &Base::dynamic);
	doCall(&b, &Base::dynamic2);

	Derived d;
	printf("-- derived --\n");
	doCall(&d, &Base::regular);
	doCall(&d, &Base::dynamic);

	printf("-- crazy -- \n");
	doCall(&d, &Derived::regular);
	doCall(&d, &Derived::dynamic);

	return 0;
}