Удаление из контейнера внешеполиморфных объектов
От: Аноним  
Дата: 24.09.09 12:24
Оценка:
Через внешний полиморфизм в контейнер помещаются объекты разных типов. Необходимо обеспечить возможность удаления из контейнера, зная исходный объект. Пока единственное, что смог придумать — использовать void *. Нет ли элегантного решения?

Упрощенный пример выглядит так:
class pure1
{
public:
    void foo1() { std::cout << "pure1::foo1()" << std::endl; }
};

class pure2
{
public:
    void foo2() { std::cout << "pure2::foo2()" << std::endl; }
};

class polymorphy
{
public:
    virtual void foo() = 0;

//    virtual bool is_equal(void *pure_) = 0;
};

template <>
void polymorphy_foo(pure1 &t)
{
    t.foo1();
}

template <>
void polymorphy_foo(pure2 &t)
{
    t.foo2();
}


template <typename T>
class polymorphy_adapter : public polymorphy
{
private:
    T * _pure;

public:
    polymorphy_adapter(T &t) : _pure(&t) {}

    virtual void foo()
    {
        polymorphy_foo<T>(*_pure);
    }

//    virtual bool is_equal(void *pure_)
//    {
//        return (_pure == pure_);
//    }

};

void test()
{
    pure1 p1;
    pure2 p2;
    typedef boost::shared_ptr<polymorphy> item_type;
    std::vector<item_type> v;
    v.push_back(item_type(new polymorphy_adapter<pure1>(p1)));
    v.push_back(item_type(new polymorphy_adapter<pure2>(p2)));

    v[0]->foo();
    v[1]->foo();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.