如何在C++11中编写一个简单的、类型擦除的可组合迭代器
How to write a simple, type-erased composable iterator in C++11
我正在尝试编写一个简单的可组合迭代器,它不公开内部类型(这样我就可以在接口中使用这些迭代器之一,并可以实现不同的操作,如concat、filter…)。它确实很简单,但我目前遇到了一个无法解决的简单编译错误
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <functional>
#include <vector>
template <typename T>
struct RangeIteratorData
{
std::function<T&()> dereference;
std::function<void()> increment;
};
template <typename T>
class RangeIterator
{
public:
template <typename I>
RangeIterator(I& iter)
{
auto dereference = [iter]() { return *iter; };
auto increment = [iter]() -> void { ++iter; }; //here's the error
m_data.dereference = dereference;
m_data.increment = increment;
}
T& operator*();
RangeIterator<T>& operator++();
private:
RangeIteratorData<T> m_data;
};
template <typename T>
RangeIterator<T>& RangeIterator<T>::operator++()
{
m_data.increment();
return *this;
}
template <typename T>
T& RangeIterator<T>::operator*()
{
return m_data.dereference();;
}
TEST_CASE("Wrap existing iterator in range iterator")
{
std::vector<int> container{ 1,2,3 };
RangeIterator<int> begin = RangeIterator<int>(container.begin());
++begin;
REQUIRE(*begin == 1);
}
错误消息为:
错误C2678二进制"++":找不到接受类型为"const std::_Vector_editor>>"的左侧操作数的运算符(或者没有可接受的转换)
我使用的是VS2015。代码本身还远远不够完整,但我不明白这个错误消息的含义。我特别不明白const是从哪里来的。
如果有人能给我指正确的位置就好了。
auto increment = [iter]() -> void { ++iter; };
将此行更改为:
auto increment = [iter]() mutable -> void { ++iter; };
如果没有mutable
,lambda类型的operator()
成员函数就是const
,所以它不能修改迭代器。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- C++-字符串是否包含一个带有简单循环的单词
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 为什么 g++ 使用 movabs 和一个奇怪的常数来简单还原?
- 为什么一个简单的程序不能立即启动
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- 一个非常简单的win32套接字代码,但工作错误
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 我写了一个简单的矢量程序,在其中我得到了以下输出。你能帮我理解它的输出吗?
- 如何使用 c++ 在命令行中创建一个简单的字符控制器?
- 对于 ~95% 写入/5% 读取线程安全的无序列图,有没有一个简单的解决方案?
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- 如何制作一个只包含字符的简单加载屏幕
- 我已经安装了用于c++编程的升华3,但在编写了一个简单的程序后,我遇到了以下错误
- 如何设置一个简单的CGAL+Qt程序
- 如何在一个简单的C++项目中使用Poco库
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 我创建了一个简单的程序,但有些地方不对劲