2017-10-17 78 views
0

當我看到使用CRTP圖案,看來稱爲在基本類型的功能名總是指向不同的名稱的實現函數在派生類型(例如:foo()在鹼品牌呼叫static_cast<DerivedType*>(this)->foo_implementation();使用CRTP與成員函數名相同

有沒有辦法使用相同的函數名稱來實現CRTP模式?我有一個更長的繼承鏈,其中函數可能沒有在鏈的第一級具體實現,所以必須使用不同的函數名不是很乾淨/可讀

我想有像下面這樣:

template <typename SecondType> 
struct FirstType { 

    void foo() { 
     static_cast<SecondType*>(this)->foo(); 
    } 

}; 

template <typename ThirdType> 
struct SecondType : FirstType<SecondType> { 

    void foo() { 
     static_cast<ThirdType*>(this)->foo(); 
    } 

}; 

struct ThirdType : SecondType<ThirdType> { 

    void foo() { 
     // Concrete implementation here 
    } 

}; 

當然,編譯器不會抱怨這個,但我想它在一個隱含的虛函數表查詢結果(儘管virtual關鍵字沒有出現)中,擊敗使用CRTP的目的。

+2

作爲你的職責不是虛擬的,沒有虛函數表。 – Jodocus

+0

對不起,修改代碼片段以反映CRTP。 – Ryan

+0

SecondType似乎沒用。如果有遺漏的細節,應該從無論如何'FirstType 繼承'。並沒有'foo'方法。最後,我不知道你的連鎖店的「第一級」是什麼。你已經拋出了太多的細節來確定你可能想要的東西,或者你的設計不好。我不能說。 – Yakk

回答

1

可以很好地使用相同的名稱爲兩個功能,它會正常工作。

使用不同的名稱的優點是,未能實現在派生類的功能將導致,而不是在運行時無限遞歸和可能的堆棧溢出編譯錯誤。

+0

我明白。因此,在編寫API時,通常是否會使用相同的函數名稱,或者這是否也是這種常見做法? – Ryan

相關問題