我有一个类似于以下的类:
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迭代器以产生可比较的默认构造迭代器是一种可能,虽然看起来过于复杂……
这里是否有任何其他选项可以支持在没有底层容器时返回空范围?
(顺便提一下,我肯定有一段时间我读了一篇关于在没有容器对象的情况下为标准容器类型生成空范围的工作文章或文章,但现在找不到任何东西.)
解决方法
不,没有.你的选择是按照你的建议.就个人而言,我可能会想到从静态空向量中劫持迭代器对;我无法想象这里会涉及到什么样的“开销”,超出了过程映像中的几个额外字节.
> 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(迄今为止)中都没有改变.