是否可以使用CRTP在静态多态中模拟纯虚函数?

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, "...")但它会生成一条错误消息,指出指向不同类的成员函数的两个成员函数指针不具有可比性.

tmy*_*ebu 9

你可以给你覆盖的东西和钩子不同的名字,如下所示:

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中以"临时"标记fdelete:

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)