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
}

questionAnswers(4)

yourAnswerToTheQuestion