我有不同的类型,说A
,B
,C
,所有的一些基础类Base
继承:这个容器的最简洁的实现是什么类型的容器?
class Base { ... };
class A : public Base { ... };
class B : public Base { ... };
class C : public Base { ... };
我需要一个容器,我们称之为Master
,持有指针的类型A
,B
对象和C
。我希望Master
容器提供一个覆盖所有包含Base
对象的迭代器,以及包含所有包含的A
,B
和C
对象的特定类型的迭代器。作为存储后端,我将使用std::vector
,但如果稍后可以轻松切换,那将会很不错。
从概念上讲,这是Master
应该呈现给外界的接口:
class Master {
public:
add(A *a);
add(B *b);
add(C *c);
remove(Base *base);
iterator<A*> a_begin();
iterator<A*> a_end();
iterator<B*> b_begin();
iterator<B*> b_end();
iterator<C*> c_begin();
iterator<C*> c_end();
iterator<Base*> base_begin();
iterator<Base*> base_end();
// also: reverse iterators, const iterators, reverse const iterators
};
接口不必匹配这个精确的语法。例如,someMaster.begin<A>()
也很好。
问题是,即使在这个简化的界面中,您已经可以看到一些代码重复的发生。在实施中更糟糕。这是不可接受的,因为如果我想添加类D
,E
和F
(也继承自Base
),我希望能够稍后容易地扩展Master
容器。我最好用一行或两行代码来扩展它。
所有这些都可以用很多dynamic_cast
ing来实现,但这很丑陋。我认为模板和多继承的一些魔法可以帮助我在这里。这个班最干净的实施是什么?
容器中元素的顺序是否相关?特别是,通过'base_begin()'和'base_end()'迭代的元素的预期顺序是什么?元素可以按类型重新排序吗? – 2010-07-05 08:57:15
如果您打算将A,B和C视为不同类型而不是Base *,那么它就会破坏多态性。 – Puppy 2010-07-05 09:30:24