問題描述
有沒有辦法讓 boost::combine
與結(jié)構(gòu)化綁定和基于范圍的 for 一起工作(這樣結(jié)構(gòu)綁定中的標(biāo)識符實際上指向容器的元素而不是嵌套的任何 boost::combine
在幕后使用)?以下(live example)無法編譯:
Is there a way to make boost::combine
work with structured bindings and range-based for (so that identifiers in the structure binding actually point to containers' elements instead of nested tuples of whatever boost::combine
uses under the hood)? The following (live example) fails to compile:
#include <boost/range/combine.hpp>
#include <iostream>
int main()
{
std::vector<int> a{1,2,3};
std::vector<int> b{2,3,4};
for (auto [f, s] : boost::combine(a, b))
{
std::cout << f << ' ' << s << std::endl
}
}
推薦答案
真正的答案是使用 boost::tie
或抓取 range-v3 zip()
這實際上產(chǎn)生了一個 std::tuple
.
The real answer is to use either boost::tie
or grab the range-v3 zip()
which actually yields a std::tuple
.
僅用于教育目的的答案只是調(diào)整 boost::tuples::cons
的結(jié)構(gòu)化綁定機制.該類型已經(jīng)有一個 get()
與 ADL 一起工作并做正確的事情,所以我們需要做的就是提供 tuple_size
和 tuple_element
(這最終真的很容易做到,因為 Boost 中已經(jīng)存在這些確切的特征):
The for educational purposes only answer is just to adapt the structured bindings machinery for boost::tuples::cons
. That type already has a get()
which works with ADL and does the right thing, so all we need to do is provide tuple_size
and tuple_element
(which ends up being really easy to do since these exact traits already exist in Boost):
namespace std {
template <typename T, typename U>
struct tuple_size<boost::tuples::cons<T, U>>
: boost::tuples::length<boost::tuples::cons<T, U>>
{ };
template <size_t I, typename T, typename U>
struct tuple_element<I, boost::tuples::cons<T, U>>
: boost::tuples::element<I, boost::tuples::cons<T, U>>
{ };
}
但實際上不要在實際代碼中這樣做,因為實際上只有類型作者應(yīng)該選擇加入這種事情.
But don't actually do that in real code, since really only the type author should opt-in to this kind of thing.
這將使結(jié)構(gòu)化綁定正常工作.
That'll make the structured binding just work.
這篇關(guān)于boost::combine,基于范圍的和結(jié)構(gòu)化綁定的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!