看一下以下简单的奇怪重复模板模式 (CRTP) 示例:
template<class Derived>
struct base
{
void foo() {
static_cast<Derived*>(this)->foo();
}
};
struct derived
: public base<derived>
{};
由于除了派生自的derived成员函数之外没有其他成员函数,因此调用会产生无限递归。我们可以修改这样的定义,只在有 a 时调用?foobasederived{}.foo()base::foostatic_cast<Derived*>(this)->foo()Derived::foo
编辑:我问的原因是foo在我的实际应用程序中有一个模板参数。而且由于模板方法不能是虚拟的,CRTP 似乎是唯一的解决方法。