我有一个类似于以下的类:
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;
};
Run Code Online (Sandbox Code Playgroud)
由于ID传递给bindings()可能不存在,我需要能够在返回类型域中表示"无绑定"值.
我不需要区分未知ID和ID映射到空vector,所以我希望能够通过上面的接口实现这一点,并返回一个带有默认构造迭代器的空范围.不幸的是,尽管a ForwardIterator是DefaultConstructible[C++ 11 24.2.5/1],比较单个迭代器的结果是未定义的[24.2.1/5],所以没有容器似乎这是不可能的.
我可以将界面更改为例如换iterator_range入a boost::optional,或者返回向量值; 前者对调用者来说更笨拙,后者有不合需要的复制开销.
另一种选择是保持静态分配的空向量并返回其迭代器.在这种情况下,开销不会有问题,但如果可以,我想避免它.
调整map迭代器以产生可比较的默认构造迭代器是一种可能,虽然看起来过于复杂......
这里是否有任何其他选项可以支持在没有底层容器时返回空范围?
(顺便提一下,我肯定有一段时间我读了一篇关于在没有容器对象的情况下为标准容器类型生成空范围的工作文章或文章,但现在找不到任何东西.)
(注意我仅限于C++ 11的功能,但是如果有任何不同的方法需要以后的功能,我会感兴趣.)
不,没有。您的选择如您所建议的那样。就我个人而言,我可能会同意从静态空向量中劫持迭代器对的想法;我无法想象除了过程映像中的几个额外字节之外,这里还会涉及什么概念上的“开销”。
这在 C++14 或 C++17 中都没有改变(到目前为止)。
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |