强制 foreach 使用常量迭代器
Force foreach to use const iterators
我有一个实现cbegin()
和cend()
函数的自定义容器类。然后我在foreach循环中使用它,但它似乎需要begin()
和end()
成员函数,即使我尝试使用const
修饰符:
for (const auto val: container)
像这样:
for (auto const val: container)
像这样:
for (const auto const val: container)
是否可以强制 foreach 使用常数 c 函数?
当然:使范围看起来好像是一个const
范围:
template <typename T>
T const& make_const(T const& argument) {
return argument;
}
// ...
for (auto&& value: make_const(argument)) {
...
}
但是,在所有情况下,基于范围的for
都将使用begin()
和end()
,并且永远不会cbegin()
或cend()
。您可能希望改为提供以下内容:
template <typename T>
auto begin(my_container<T> const& t) -> decltype(t.cbegin()) {
return t.cbegin();
}
template <typename T>
auto end(my_container<T> const& t) -> decltype(t.cend()) {
return t.cend();
}
显然,您希望用合适的容器类型替换my_container
。就个人而言,我可能只会提供合适的begin()
和end()
成员。
我不确定仅提供cbegin()
和cend()
的决定是什么,但这些不在基于的范围内使用。如果要在基于 的范围内使用容器,则需要提供begin()
和end()
(尽管您可以让它们返回 const 迭代器)
您应该始终在两个重载(常量和非常量重载)中提供begin()
/end()
函数。新的cbegin()
/cend()
函数的目的是允许用auto
进行扣除,如下所示:
for (auto it = v.cbegin(); it != v.cend(); ) { /* ... */ }
如果没有新功能,您只能在此处获取非常量迭代器(或插入非常尴尬的强制转换)。
相关文章:
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何实现常量迭代器?
- 是否可以重用通常的迭代器来构建常量迭代器?
- 使用 declval 获取非常量迭代器
- 为什么在此代码中隐式转换为常量迭代器失败?
- 常量迭代器的问题
- 链表常量迭代器
- 属性树常量迭代器的索引
- 如何正确地声明从非常量迭代器到指针的常量指针
- 无法取消引用映射常量迭代器的mapped_type
- 强制 foreach 使用常量迭代器
- 使用常量迭代器的运算符重载
- unordered_set 非常量迭代器
- 常量迭代器与可变迭代器:相同的算法不同的代码
- 自定义迭代器和自定义常量迭代器之间的转换
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- 在 C++14 中,常量迭代器仍然是邪恶的吗?
- 用常量迭代器从STL容器中擦除
- c++ STL,常量迭代器,find()
- 在 Boost 的多索引容器中获取一个非常量迭代器