OK here we go. I’m trying to use the CRTP template in order to remove the need of polymorphism from my app. I use an aproach like the one bellow
template <RealType> class Base
{
void doSomething()
{
static_cast<RealType>(this)->doSomethingImpl()
}
class Derived1 : public Base
{
void doSomethingImpl()
{
/* do something, for real */
}
}
class Derived2 : public Base
{
void doSomethingImpl()
{
/* do something else */
}
}
This aproach, if I understood correctly, allows my classes to have no vtable, so function calls are direct and don’t require the extra indirection.
Now imagine I want to store all my Derived# classes in a container. Let’s say a vector.
First approach : I can create a non-template SuperBase class from which Base inherits and store that in the container.
However it seems to me that if I want to do that, I will have to make doSomething virtual, in SuperBase. And my goal is mainly not to have a vtable.
Second approach : I use type erasure, i.e. something like boost::any to store my elements in the Vector.
But then, I don’t see a way I can iterate over the elements and call doSomething on them, because to “use” boost::any, I need to know the real type of the object when iterating.
Do you think what I want to do is even possible ?
Seems to me that it is because doSomething() is part of Base but except using inheritance, I can’t see a way to do it ….
If you want this, then, unless you implement your own virtual dispatch system (which would likely be inferior to what the compiler does), you’re stuck with templates, a.k.a. compile-time polymorphism. And as the name says, in order to use this, everything must be known at compile-time. If you need to make decisions based on runtime events (like, e.g., user input), you want runtime polymorphism.
I can’t help but have to ask: Why do you want to avoid vtables? (And if you’re so determined, why aren’t you programming in C?)