在CRTP中为了避免动态多态性,为了避免虚成员函数的开销并强加一个特定的接口,提出了以下解决方案:
template <class Derived>
struct base {
void foo() {
static_cast<Derived *>(this)->foo();
};
};
struct my_type : base<my_type> {
void foo() {}; // required to compile. < Don't see why
};
struct your_type : base<your_type> {
void foo() {}; // required to compile. < Don't see why
};
然而,派生类似乎不需要定义来编译,因为它继承了一个(代码编译良好,无需定义 my_type::foo)。事实上,如果提供了一个函数,那么在使用派生类时将不会调用基函数。
所以问题是,以下代码替换是否可以接受(和标准?):
template <class Derived>
struct base {
void foo() {
// Generate a meaningful error if called
(void)sizeof( Derived::foo_IS_MISSING );
};
};
struct my_type : base<my_type> {
void foo() {}; // required to compile.
};
struct your_type : base<your_type> {
void foo() {}; // required to compile.
};
int main() {
my_type my_obj;
my_obj.foo(); // will fail if foo missing in derived class
}