我正试图围绕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