boost multi_index - 如果元素类型仅支持移动语义,如何遍历它?
boost multi_index - how to iterate through it if element type supports move-semantic only?
typedef boost::multi_index_container<foo, ...
struct foo {
...
std::unique_ptr<Bar> bar; // requires move-semantic only
foo() { bar = std::make_unique<Bar>(); }
foo(foo&&) = default;
};
我对push_back
没有任何问题 - 只是使用push_back(std::move(...))
.
此外,以下方面没有问题:
auto it = container.get<...>().find(...);
container.erase(it);
但我还需要迭代容器的所有元素。我做:
for (auto it = container.begin(); auto it = container.end(); ++it) {
some_foo(*it); // For instance, another_container_of_same_type.push_back(*it) - to merge 2 containers
}
或者,在特殊情况下:
for (auto it = container.begin(); auto it = container.end(); ++it) {
// some logics
another_container_of_same_type.push_back(*it); //another container defined same as first one
// some logics
}
而且它不编译!
我试过了:
some_foo(std::move(*it))
some_foo(std::move(it))
some_foo(it)
some_foo(*it)
不编译。它想要复制构造函数或移动...
警告:不,它不是简单地合并两个容器,我在合并中使用我的自定义逻辑,也使用迭代而不仅仅是为了合并。
您没有显示some_foo
的声明,但可能您没有通过引用获取参数。
这里有一个简单的、自包含的例子,应该能让你开始。
住在科利鲁
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/sequenced_index.hpp>
// move-only
struct foo {
foo() = default;
foo(foo&&) = default;
foo(foo const&) = delete;
foo& operator=(foo&&) = default;
foo& operator=(foo const&) = delete;
};
namespace bmi = boost::multi_index;
using foos = bmi::multi_index_container<foo, bmi::indexed_by<bmi::sequenced<> > >;
void some_foo(foo const&) {}
int main() {
foos c;
for (auto& el : c) {
some_foo(el);
}
}
编译正常。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 关于链表遍历和调试的困惑
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 二叉树级别顺序遍历在leetcode中