Хорошо, поехали. Я пытаюсь использовать шаблон CRTP , чтобы избавиться от необходимости полиморфизма в моем приложении. Я использую подход, подобный приведенному ниже
template class Base
{
void doSomething()
{
static_cast(this)->doSomethingImpl()
}
class Derived1 : public Base
{
void doSomethingImpl()
{
/* do something, for real */
}
}
class Derived2 : public Base
{
void doSomethingImpl()
{
/* do something else */
}
}
Этот подход, если я правильно понял, позволяет моим классам не иметь vtable, поэтому вызовы функций являются прямыми и не требуют дополнительной косвенной адресации.
Теперь представьте, что я хочу сохранить все свои классы Derived # в контейнере . Позволять' s говорят вектор.
Первый подход: я могу создать класс SuperBase, не являющийся шаблоном, от которого Base наследует, и сохранить его в контейнере.
Однако мне кажется, что если я захочу это сделать, мне придется сделать doSomething виртуальным в SuperBase. И моя цель - не иметь vtable.
Второй подход: я использую стирание типа, то есть что-то вроде boost :: any для хранения моих элементов в векторе. Но тогда я не вижу способа перебирать элементы и вызывать для них doSomething, потому что для "использования" boost :: any мне нужно знать реальный тип объекта при итерации.
Думаешь, то, что я хочу сделать, возможно?
Мне кажется, что это потому, что doSomething () является частью Base, но, кроме использования наследования, я не вижу способа сделать это ....