Inb*_*ong 10 c++ static-polymorphism
我正在尝试使用CRTP实现编译时多态,并希望强制派生类实现该函数.
目前的实施是这样的.
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->f();
}
};
struct derived : base<derived>
{
void f() {
...
}
};
Run Code Online (Sandbox Code Playgroud)
在此实现中,如果派生类未实现,则对函数的调用将进入无限循环f()
.
如何强制派生类实现像纯虚函数一样的函数?我尝试使用'static_assert',static_assert(&base::f != &Derived::f, "...")
但它会生成一条错误消息,指出指向不同类的成员函数的两个成员函数指针不具有可比性.
你可以给你覆盖的东西和钩子不同的名字,如下所示:
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->fimpl();
}
void fimpl() = delete;
};
struct derived : base<derived> {
void fimpl() { printf("hello world\n"); }
};
Run Code Online (Sandbox Code Playgroud)
这里,fimpl = delete
在基础中,除非fimpl
在派生类中被覆盖,否则不能被意外调用.
您还可以将中间隐藏层粘贴到CRTP中以"临时"标记f
为delete
:
template <class Derived>
struct base {
void f() {
static_cast<Derived*>(this)->f();
}
};
template <class Derived>
struct intermediate : base<Derived> {
void f() = delete;
};
struct derived : intermediate<derived> {
void f() { printf("hello world\n"); }
};
Run Code Online (Sandbox Code Playgroud)