CRTP para evitar sobrecarga da função de membro virtual
DentroCRTP para evitar polimorfismo dinâmico, a seguinte solução é proposta para evitar a sobrecarga das funções de membro virtual e impor uma interface específica:
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
};
No entanto, parece que a classe derivada não requer uma definição para compilar, pois herda uma (o código compila bem sem definir my_type :: foo). De fato, se uma função for fornecida, a função base não será chamada ao usar a classe derivad
A pergunta é: a substituição do código a seguir é aceitável (e padrão?):
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
}