我不得不质疑你为什么要这样做。除非你这样做是为了学术/实验目的并且你打算把它扔掉,否则你是在为自己工作,并且几乎肯定会得到比使用语言和 STL 的设施更容易出现问题的代码已经提供。在 C 中,您可能必须这样做,但在 C++ 中,您不必这样做,因为那里有语言支持。
您正在做的事情有两个方面:拥有可以以某种定义的方式通用使用的任何类型的元素,并将这些元素收集在一起。那么第一个方面可以很容易地通过多态性来实现。创建一个定义通用接口的抽象基类:
struct BaseElement { virtual void doSomething( ); };
然后,您可以从中派生结构,这些结构涵盖了您的元素正在做什么:
struct DerivedElement1 : public BaseElement { void doSomething( ); };
struct DerivedElement2 : public BaseElement { void doSomething( ); };
要将类型收集在一起,您可以简单地使用 STL 向量。据我所知,它提供了您需要的所有东西。作为一个非常简单的示例,您可以执行以下操作:
// Convenient shorthand.
typedef std::vector< std::shared_ptr<BaseElement> > MyElements;
MyElements m;
// Create two different but commonly derived objects.
std::shared_ptr<DerivedElement1> e1(new DerivedElement1);
std::shared_ptr<DerivedElement2> e2(new DerivedElement2);
// Push them onto the collection.
m.push_back( e1.static_pointer_cast<BaseElement>( e1 ) );
m.push_back( e2.static_pointer_cast<BaseElement>( e2 ) );
在这一点上,你已经得到了你需要的一切。Vector 提供了标准功能,例如begin()
,如果您愿意,它可以帮助您遍历集合并在其上运行 STL 算法end()
。size()
集合是多态的这一事实意味着您可以doSomething()
在每个元素上运行,知道它只会执行为该结构定义的内容。
(我没有 C++11 编译器的访问权限,所以我相信有人会在这里接我。但是,如果你使用原始指针,即使使用原始指针也可以使用 C++11 之前的代码轻松实现相同的目标'小心正确地清理你的物品。)
我知道这不是你直接想要的答案,但我只是想强调,除非你只是想通过丢弃的例子来学习,否则使用已有的东西几乎总是更快、更短、更安全、更可靠。