boost::combine结果修改编译报错,如何实现v1与v2对应元素相加?
解决Boost Combine与C++17结构化绑定的兼容问题
你遇到的问题根源在于:boost::combine返回的元素是Boost.Tuple类型,而C++17的结构化绑定默认只兼容标准库的std::tuple/std::pair,无法直接解析Boost的tuple结构。这就导致你写的auto&& [a, b]里,b被错误识别成了tuple的tail部分(一个子tuple),而不是你期望的第二个int引用,最终触发了int和tuple相加的错误。
下面给你两种可行的解决方案,都能实现你预期的功能:
方案1:直接使用Boost.Tuple的get方法访问元素
这是最直接且兼容性最好的方式,不需要依赖结构化绑定,直接通过索引获取元素的引用:
#include <boost/range/combine.hpp> #include <vector> int main() { std::vector<int> v1{1, 2, 3, 4, 5}; std::vector<int> v2{6, 7, 8, 9, 10}; for(auto&& elem : boost::combine(v1, v2)) { // get<0>对应v1的元素引用,get<1>对应v2的元素引用 boost::get<0>(elem) += boost::get<1>(elem); } // 此时v1的值为{7, 9, 11, 13, 15} return 0; }
方案2:将Boost.Tuple转换为标准库tuple,适配结构化绑定
如果你坚持想用结构化绑定,可以把Boost的tuple转换成std::tuple(或者用std::tie保持引用),让结构化绑定能正确解析:
#include <boost/range/combine.hpp> #include <vector> #include <tuple> int main() { std::vector<int> v1{1, 2, 3, 4, 5}; std::vector<int> v2{6, 7, 8, 9, 10}; for(auto&& elem : boost::combine(v1, v2)) { // 用std::tie获取两个元素的引用,适配结构化绑定 auto& [a, b] = std::tie(boost::get<0>(elem), boost::get<1>(elem)); a += b; } // 此时v1的值为{7, 9, 11, 13, 15} return 0; }
两种方案编译时都用g++ -std=c++17即可通过,执行后v1都会变成你期望的{7, 9, 11, 13, 15}。
内容的提问来源于stack exchange,提问作者Mathias Vorreiter Pedersen
相关产品推荐
相关产品推荐

