當我看到使用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的目的。
作爲你的職責不是虛擬的,沒有虛函數表。 – Jodocus
對不起,修改代碼片段以反映CRTP。 – Ryan
SecondType似乎沒用。如果有遺漏的細節,應該從無論如何'FirstType繼承'。並沒有'foo'方法。最後,我不知道你的連鎖店的「第一級」是什麼。你已經拋出了太多的細節來確定你可能想要的東西,或者你的設計不好。我不能說。 –
Yakk