在C++中不直接支持約束,用過C#模板的有個where來處理,但是C++中也有些小的技巧來處理。
在不完美C++中的must_have_base如下:
template<typename D, typename B>
struct must_have_base
{
~must_have_base()
{
void (*p)(D*, B*) = constraints;
}
private:
static void constraints(D *pd, B *pb)
{
pb = pd;
}
};
原理是通過不執(zhí)行的成員函數(shù)把函數(shù)指針在析構(gòu)函數(shù)中賦值,強迫編譯器在編譯期間檢查成員函數(shù)內(nèi)的約束。
自己寫了個小的實例,雖然這兒有點點牽強,但是,很多情況也需要檢查是否是某種類型的子類型的時候還是可以的,
完整代碼如下:
1
2 template<typename D, typename B>
3 struct must_have_base
4 {
5 ~must_have_base()
6 {
7 void (*p)(D*, B*) = constraints;
8 }
9
10 private:
11 static void constraints(D *pd, B *pb)
12 {
13 pb = pd;
14 }
15 };
16
17 class base
18 {
19 public:
20 virtual ~base() {}
21
22 virtual void run() = 0;
23 };
24
25 class inherit_base: public base
26 {
27 public:
28 virtual void run()
29 {
30
31 }
32 };
33
34 class inherit_not_base
35 {
36 public:
37 virtual void run()
38 {
39
40 }
41 };
42
43 class test
44 {
45 public:
46 template<typename T>
47 void testfunc(T &t)
48 {
49 must_have_base<T, base>();
50
51 t.run();
52 }
53 };
54
55 int main()
56 {
57 test t_ok, t_nok;
58 inherit_base hb;
59 inherit_not_base hnb;
60 t_ok.testfunc(hb);
61 t_nok.testfunc(hnb);
62
63 return 0;
64 }
拋磚引玉,希望這些東西都能用在實際的工程代碼中。