C ++ - & CRTP. Стирание типов против полиморфизма

Хорошо, поехали. Я пытаюсь использовать шаблон 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, но, кроме использования наследования, я не вижу способа сделать это ....

8
задан Dinaiz 30 November 2010 в 16:57
поделиться