C 繼承模板類 引數是子類 替代虛函式。模板類只能訪問子類公共成員,受保護的不行?

時間 2021-06-27 04:27:09

1樓:Jon Lee

這是CRTP (curiously recurring template pattern,https://

en.m.wikipedia.org/wiki

/Curiously_recurring_template_pattern

)。通過把建立虛函式表vtable的過程搬到編譯時間來提高效率。對於多次重複呼叫的函式,效能提高還是很客觀的。

很多優秀的模版庫都在用這個pattern,比如Eigen library.

父類access子類的protected或者private 函式問題,我用的是最普遍的解決方式:加上 friend。當然如果多層繼承,每乙個子類都要加呼叫他的父類為friend,這很麻煩,但鑑於子類最好將實現設為private,也只能這樣了。

還有另外的方法比如設乙個中間非模版accessor類,通過它來傳遞friendship。對我個人而言,不是很喜歡。

這篇文章裡:https://

accu.org/index.php/jour

nals/296

把我以上說的都講的很清楚,值得一看。

文章裡還有乙個偏方,是用函式指標,不用任何friend。娛樂一下就好了,我覺得實際上不適用。第一,子類必須是protected不能是private;第二,成員函式指標編譯器優化不好。

C 巢狀類類模板特化 error explicit specialization?

夏之幻想 特化需要在命名空間裡做,所以你不能在類內直接特化乙個類模板,你可以放到類外來做。PS.VS2015是允許這麼做的,這是微軟私貨,如果你注重可移植性就不要依賴這個特性。n4618 14.7.3 2 An explicit specialization shall be declared in...

C 抽象類作為模板引數,當其為指標時,如何析構?

小明 別總想著只要是物件就要new,多用RAII解決資源問題。首先你的linklist初始化就不要new.你要做的是過載 operator 接著linklist繼承的是linerlist是如何實現,為啥抽象基類要具體化,你只是使用他的指標。多用智慧型指標,如果嫌棄智慧型指標,就學一下智慧型指標的思路...

C 類型別能否作為引數儲存?

夏洋 當這些類都繼承自乙個基類時,可以 其實就是個factory struct Base typedef map string std function void Creators Creators GetCreators Base create const string key template ...