C++11环境下如何遍历指向带自定义迭代器类的智能指针
问题解决思路
核心原因
C++11 范围for循环的工作逻辑是对目标对象调用begin()和end()获取迭代器,你当前传入遍历的list是std::unique_ptr<ListClass>智能指针对象,智能指针本身未实现迭代器接口,只有它指向的ListClass实例才内置了begin()/end()方法,这就是直接遍历报错、裸对象能正常遍历的原因。
最简解决方案
不需要修改原有类的定义,仅需要在遍历时对智能指针做解引用操作即可,修改DoSomeWorkOtherList函数中的遍历代码:
void DoSomeWorkOtherList( const ListPtr_t& list ) { // 对list解引用拿到ListClass实例再遍历即可 for( auto const& dev : *list ) { // 此处即可正常访问dev.a等成员 printf("%d\n", dev.a); } }
该方案完全符合C++11语法规范,不需要做任何额外适配,也没有额外性能开销。
补充注意事项
你给出的示例代码中struct SomeContrainer定义末尾遗漏了分号,实际编译时需要补全才能正常运行:
struct SomeContrainer { int a; }; // 补全分号
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

