Polimorfismo estático com CRTP: usando a classe base para chamar métodos derivados
Um dos principais benefícios devirtual
em C ++ é capaz de usar a classe base (ponteiro ou referência) para chamar métodos derivados.
Eu estou lendousando CRTP para implementar polimorfismo estático, mas não consigo entender como alcançar o que mencionei acima usando essa técnica, porque não consigo declarar uma função como tendo o tipoBase
quando isso requer um modelo.
Parece-me que o que está descrito no artigo pode ser alcançado usando simplesmente a sobrecarga de funções, por isso tenho certeza de que deve haver mais nessa técnica.
(PS: esse problema exato é mencionado em um comentário a uma resposta paraessa questão, mas infelizmente ninguém respondeu: "O que o vtables realmente fornece é usar a classe base (ponteiro ou referência) para chamar métodos derivados. Você deve mostrar como isso é feito com o CRTP aqui.")
Aqui está o meu código mínimo, que fornece o erro "falta de argumentos do modelo antes do token 'e' anula a impressão (base e objeto)".
#include <cstring>
#include <iostream>
template <typename Derived>
struct Base
{
std::string ToStringInterface() { return static_cast<Derived*>(this)->ToString(); }
std::string ToString() { return "This is Base."; }
};
struct Derived : Base<Derived>
{
std::string ToString() { return "This is Derived."; }
};
void Print(Base& Object)
{
std::cout << Object->ToStringInterface() << std::endl;
}
int main()
{
Derived MyDerived;
// This works, but could have been achieved with a function overload.
std::cout << MyDerived.ToStringInterface() << std::endl;
// This does not work.
Print(MyDerived);
}