鍦ㄤ笉瀹岀編C++涓殑must_have_base濡備笅錛?br />
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;
}
};
鍘熺悊鏄氳繃涓嶆墽琛岀殑鎴愬憳鍑芥暟鎶婂嚱鏁版寚閽堝湪鏋愭瀯鍑芥暟涓祴鍊鹼紝寮鴻揩緙栬瘧鍣ㄥ湪緙栬瘧鏈熼棿媯(gè)鏌ユ垚鍛樺嚱鏁板唴鐨勭害鏉熴?
鑷繁鍐欎簡涓皬鐨勫疄渚嬶紝铏界劧榪欏効鏈夌偣鐐圭壍寮猴紝浣嗘槸錛屽緢澶氭儏鍐典篃闇瑕佹鏌ユ槸鍚︽槸鏌愮綾誨瀷鐨勫瓙綾誨瀷鐨勬椂鍊欒繕鏄彲浠ョ殑錛?br />瀹屾暣浠g爜濡備笅錛?br /> 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 }
鎶涚爾寮曠帀錛屽笇鏈涜繖浜涗笢瑗塊兘鑳界敤鍦ㄥ疄闄呯殑宸ョ▼浠g爜涓?img src ="http://www.shnenglu.com/sh19871122/aggbug/207853.html" width = "1" height = "1" />
]]>