c++ - 如何为 const 和非 const 容器版本的迭代器定义类型
问题描述
考虑这个例子:
template <typename T> struct A {
using Iter = typename T::iterator;
Iter iter;
A(T& cont) {
iter = cont.begin();
}
typename Iter::reference value() { return *iter; }
};
void f(std::vector<int>& v) {
A a(v);
a.value() = 10;
}
它工作正常,如果您添加const
到容器类型,则购买,它不再编译!
int g(const std::vector<int>& v) {
A a(v); // ERROR
return a.value();
}
如何定义迭代器类型,它将与 const/non-const 容器类型一起编译。我需要这样的东西:
using Iter = decltype(T::begin());
解决方案
思路一:直接检查迭代器的类型。
执行:
using Iter = decltype(std::declval<T>()::begin());
想法2:检查类型是否为const
并使用此知识定义迭代器。
执行:
#include <vector>
#include <type_traits>
template <typename T> struct A {
using Iter = std::conditional_t<
std::is_same_v<std::remove_const_t<T>, T>, typename T::iterator, typename T::const_iterator
>;
Iter iter;
A(T& cont) {
iter = cont.begin();
}
};
void f(const std::vector<int>& v) {
A a(v);
}
void f1(std::vector<int>& v) {
A a(v);
}
推荐阅读
- css - 有没有办法防止静态定位的内容尊重绝对定位的标题的高度?
- c++ - 使用 char 数组进行二进制加法
- c++ - 是否可以解决我更新 Mac 后出现的这个错误?
- python - simpletransformers.ai LayoutLM 模型的输入数据格式
- file - Pytest/Python - 在文件中的一行位置断言文本
- git - 如何转换 git 存储库中的大量提交
- python - Turtle python重置屏幕并在用户提示上显示新数据
- mysql - SQL - 选择任何给定日期的一周的第一天的日期,按年的周分组,一周的第一天基于用户区域设置
- flutter - 有没有办法删除 TextField 中的整个关键字而不是每个字符?
- r - all() 函数给出 TRUE 但 any() 给出 FALSE 以进行相同的比较