Estou explorando o novo recurso de dedução introduzido no C++23 e tentando entender como combiná-lo efetivamente com o Curiously Recurring Template Pattern (CRTP) para implementar comportamento polimórfico sem depender de funções virtuais tradicionais.
Meu objetivo é gerenciar uma coleção de objetos derivados (por exemplo, formas, processadores, etc.) de forma apagada ou semipolimórfica e ainda obter os benefícios do polimorfismo estático e possivelmente reduzir a indireção e a alocação dinâmica.
#include <vector>
#include <iostream>
template <typename Derived>
struct Base {
void process(this Derived& self) {
self.impl(); // supposed to call derived's impl()
}
};
struct DerivedA : Base<DerivedA> {
void impl() {
std::cout << "DerivedA::impl\n";
}
};
struct DerivedB : Base<DerivedB> {
void impl() {
std::cout << "DerivedB::impl\n";
}
};
int main() {
std::vector</* ??? */> collection;
collection.push_back(DerivedA{});
collection.push_back(DerivedB{});
for (auto& obj : collection) {
obj.process(); // call the correct impl() for each type
}
}
Sei que essa std::variant
é uma maneira de lidar com isso, mas estou procurando soluções alternativas de alto desempenho. Idealmente, gostaria de evitar a sobrecarga de alocações dinâmicas e funções virtuais e usar recursos modernos do C++23, como deduzir isso com CRTP, para obter os benefícios do polimorfismo estático.