当前位置:  开发笔记 > 编程语言 > 正文

一个C++迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

如何解决《一个C++迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型》经验,为你挑选了1个好方法。

玩弄了这个,我怀疑它不可能,但我想我会问专家.我有以下C++代码:

class IInterface
{
    virtual void SomeMethod() = 0;
};

class Object
{
    IInterface* GetInterface() { ... }
};

class Container
{
private:
    struct Item
    {
        Object* pObject;
        [... other members ...]
    };
    std::list m_items;
};

我想将这些方法添加到Container:

    MagicIterator Begin();
    MagicIterator End();

为了让呼叫者可以写:

Container c = [...]
for (MagicIterator i = c.Begin(); i != c.End(); i++)
{
    IInterface* pItf = *i;
    [...]
}

所以基本上我想提供一个类似乎迭代某些集合(其中Begin()和End()的调用者不允许看到)的IInterface指针,但它实际上迭代了指向其他指针的指针集合.对象(Container类专用),可以转换为IInterface指针.

几个关键点:

MagicIterator是在外面定义的Container.

Container::Item 必须保持私密.

MagicIterator有遍历IInterface,指针尽管事实Container持有std::list.Container::Item包含一个Object*,Object可用于获取IInterface*.

MagicIterator必须可以重用几个类似于Container的类,但可能在内部有不同的列表实现std::vector,每个时间以不同的方式保存不同的对象(,mylist)IInterface*.

MagicIterator不应该包含特定于容器的代码,尽管它可以委托给那样做的类,只要这样的委托不是硬编码到内部的特定容器MagicIterator(例如,由编译器以某种方式自动解析).

解决方案必须在Visual C++下编译而不使用其他库(例如boost),这需要其作者的许可协议.

此外,迭代可能不会分配任何堆内存(所以没有new()malloc()在任何阶段),没有memcpy().

感谢您的时间,即使您只是在阅读; 这个人真的在烦我!

更新:虽然我有一些非常有趣的答案,但还没有一个满足上述所有要求.值得注意的是,棘手的领域是:i)以某种方式将MagicIterator与Container分离(默认模板参数不会削减它),以及ii)避免堆分配; 但我真的想要一个涵盖所有上述子弹的解决方案.



1> jpalecek..:

我认为你有两个不同的问题:

首先,创建一个迭代器,它将返回IInterface*你的list.这很容易完成boost::iterator_adaptor:

class cont_iter
  : public boost::iterator_adaptor<
        cont_iter                       // Derived
      , std::list::iterator // Base
      , IInterface*                     // Value
      , boost::forward_traversal_tag    // CategoryOrTraversal
      , IInterface*                     // Reference :)
    >
{
 public:
    cont_iter()
      : cont_iter::iterator_adaptor_() {}

    explicit cont_iter(const cont_iter::iterator_adaptor_::base_type& p)
      : cont_iter::iterator_adaptor_(p) {}

 private:
    friend class boost::iterator_core_access;
    IInterface* dereference() { return this->base()->pObject->GetInterface(); }
};

您可以创建这种类型的内部Container,并从其返回begin()end()方法.

其次,您需要运行时多态MagicIterator.这正是这样any_iterator做的.的MagicIterator只是any_iterator,并且cont_iter可以只分配给它.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有