我正試圖圍繞CRTP包裹我的頭。有一些很好的資源,包括這個論壇,但我認爲我對靜態多態的基礎知識有些困惑。看着下面的維基百科條目:關於CRTP靜態多態性的困惑
template <class T>
struct Base
{
void implementation()
{
// ...
static_cast<T*>(this)->implementation();
// ...
}
static void static_func()
{
// ...
T::static_sub_func();
// ...
}
};
struct Derived : public Base<Derived>
{
void implementation();
static void static_sub_func();
};
我明白,這可以幫助我有不同的實現()的派生類變種,有點像一個編譯時虛函數。然而,我的困惑是,我想我不能有像
void func(Base x){
x.implementation();
}
功能我會與正常的繼承和虛函數,由於基數正在模板,但我必須要麼指定
func(Derived x)
或使用
template<class T>
func(T x)
那麼,是什麼CRTP實際購買我在這方面,而不是簡單地遮蔽/實施中派生:: Base的簡單方法?
struct Base
{
void implementation();
struct Derived : public Base
{
void implementation();
static void static_sub_func();
};
當你把由值的'Base'例如,你從[對象切片]遭受(https://en.wikipedia.org/wiki/Object_slicing)。如果您想要多態行爲(無論使用靜態還是動態多態),請通過引用或指針傳遞它。 –
不適用於我,我得到變量或字段'func'聲明爲void void func(Base&x)... – user32849
@ user32849'Base'是一個模板。你不能只使用'Base&',你必須提供一個模板參數:'Base&'。這意味着'func'也必須是一個模板。 –
Angew