struct Config { using BindingContainer = std::map<ID,std::vector<Binding>>; using BindingIterator = BindingContainer::mapped_type::const_iterator; boost::iterator_range<BindingIterator> bindings(ID id) const; private: BindingContainer m_bindings; };
由于传递给bindings()的ID可能不存在,我需要能够在返回类型域中表示“无绑定”值.
我不需要将未知ID与映射到空向量的ID区分开来,所以我希望能够通过上面的接口实现这一点并返回带有默认构造迭代器的空范围.不幸的是,尽管ForwardIterator是DefaultConstructible [C 11 24.2.5 / 1],比较单个迭代器的结果是未定义的[24.2.1 / 5],所以没有容器似乎这是不可能的.
我可以改变界面,例如将iterator_range包装在boost :: optional中,或者返回一个向量值;前者对调用者来说更笨拙,后者有不合需要的复制开销.
另一种选择是保持静态分配的空向量并返回其迭代器.在这种情况下,开销不会有问题,但如果可以,我想避免它.
调整map迭代器以产生可比较的默认构造迭代器是一种可能,虽然看起来过于复杂……
这里是否有任何其他选项可以支持在没有底层容器时返回空范围?
(顺便提一下,我肯定有一段时间我读了一篇关于在没有容器对象的情况下为标准容器类型生成空范围的工作文章或文章,但现在找不到任何东西.)
(注意我仅限于C 11功能,但如果有任何不同的方法需要以后的功能,我会感兴趣.)
解决方法
> Is this a singular iterator and,if so,can I compare it to another one?
> Comparing default-constructed iterators with operator==
这在C 14或C 17(迄今为止)中都没有改变.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。