Через внешний полиморфизм в контейнер помещаются объекты разных типов. Необходимо обеспечить возможность удаления из контейнера, зная исходный объект. Пока единственное, что смог придумать — использовать 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();
}