玩弄过这个我怀疑这是不可能的,但我想我会问专家。我有以下 C++ 代码:
I类接口
{
虚拟 void SomeMethod() = 0;
};
类对象
{
IInterface* GetInterface() { ... }
};
类容器
{
私人的:
结构项目
{
对象* pObject;
[... 其他成员 ...]
};
std::list<项目> m_items;
};
我想将这些方法添加到容器中:
MagicIterator<IInterface*> Begin();
MagicIterator<IInterface*> End();
为了调用者可以写:
容器 c = [...]
for (MagicIterator<IInterface*> i = c.Begin(); i != c.End(); i++)
{
IInterface* pItf = *i;
[...]
}
所以本质上我想提供一个类,它似乎在迭代 IInterface 指针的某些集合(不允许 Begin() 和 End() 的调用者看到),但实际上是在迭代指向其他指针的集合可以转换为 IInterface 指针的对象(专用于 Container 类)。
几个关键点:
MagicIterator是要在外面定义的Container。Container::Item必须保持私密。
MagicIterator必须迭代IInterface指针,尽管事实上Container持有一个std::list<Container::Item>.Container::Item包含一个Object*, 并且Object可以用来获取IInterface*.
MagicIterator必须可与多个类似于 Container 的类重用,但可能在内部具有不同的列表实现,其中包含不同的对象 (std::vector<SomeOtherItem>,mylist<YetAnotherItem>),并且IInterface*每次都以不同的方式获得。
MagicIterator不应该包含特定于容器的代码,尽管它可以委托给这样做的类,前提是这种委托没有硬编码到内部的特定容器MagicIterator(例如,编译器会以某种方式自动解析)。
- 该解决方案必须在 Visual C++ 下编译,而不使用其他库(例如 boost),这需要其作者的许可协议。
- 此外,迭代可能不会分配任何堆内存(因此没有
new()或malloc()在任何阶段),并且没有memcpy().
感谢您的宝贵时间,即使您只是在阅读;这个真的一直困扰着我!
更新:虽然我得到了一些非常有趣的答案,但还没有一个满足上述所有要求。值得注意的是,棘手的领域是 i) 以某种方式将 MagicIterator 与 Container 分离(默认模板参数不会削减它),以及 ii) 避免堆分配;但我真的在寻求涵盖所有上述项目符号的解决方案。