2015-01-29 9 views
2

안녕하세요!부스트 퓨전 : flatten_view 및 zip_view 중첩

부스트 퓨전을 사용하여 다른보기를 중첩하려고 필사적으로 노력하고 있습니다. 나는 아직도 퓨전을 배우는 중이다. 그래서 바보 같은 질문이라면 사과한다.

내 실제 시나리오는 훨씬 더 복잡하지만 설명을 위해 가능한 한 단순화하려고 노력할 것입니다. 지금 달성하고 싶은 무엇

typedef fusion::vector<int, int, int> IntVector; 
IntVector v1(1,2,3); 
IntVector v2(4,5,6); 
typedef fusion::vector<IntVector&, IntVector&> VVector; 
VVector vv(v1,v2); 

IE에서 vv를 통과 게으른보기 vv에 포함 된 벡터의 인터리빙이다 : 나는 자체가 또 다른 퓨전 벡터 vv 두 퓨전 벡터 v1v2을 포함 한하는 다음 순서는 : 나는 다음과 같이 zipflatten 중첩에 대해 그것을 달성하기 위해

1,4,2,5,3,6 

생각했다

:

typedef fusion::zip_view<VecVector> ZipView; 
auto zv = ZipView(vv); 
typedef fusion::flatten_view<ZipView> FlattenView; 
auto fv = FlattenView(zv); 

그러나 이것은 fv에있는 참조 해제 요소를 시작하자마자 문제가 발생합니다.

auto first = fusion::begin(fv); 

이 다음과 같은 출력을 생성합니다 :

iteration01.cpp:486:27: instantiated from here 
boost/fusion/view/flatten_view/flatten_view_iterator.hpp:80:36: error: no matching function for call to ‘boost::fusion::detail::make_descent_cons<boost::fusion::vector_iterator<boost::fusion::vector2<int&, int&>, 0>, void>::apply(const type)’ 
boost/fusion/view/flatten_view/flatten_view_iterator.hpp:80:36: note: candidate is: 
boost/fusion/view/flatten_view/flatten_view_iterator.hpp:54:28: note: static boost::fusion::detail::make_descent_cons<Iterator, <template-parameter-1-2> >::type boost::fusion::detail::make_descent_cons<Iterator, <template-parameter-1-2> >::apply(const Iterator&) [with Iterator = boost::fusion::vector_iterator<boost::fusion::vector2<int&, int&>, 0>, <template-parameter-1-2> = void, boost::fusion::detail::make_descent_cons<Iterator, <template-parameter-1-2> >::type = boost::fusion::cons<boost::fusion::vector_iterator<boost::fusion::vector2<int&, int&>, 0>, boost::fusion::nil_>] 
boost/fusion/view/flatten_view/flatten_view_iterator.hpp:54:28: note: no known conversion for argument 1 from ‘const type {aka const boost::fusion::vector_iterator<const boost::fusion::vector2<int&, int&>, 0>}’ to ‘const boost::fusion::vector_iterator<boost::fusion::vector2<int&, int&>, 0>&’ 

내가 연령대이 예 놀아 봤는데,하지만 난 무슨 일이 일어나고 있는지 주위에 내 머리를 정리하고 수 없습니다 예를 들어. 누군가가 나를 올바른 방향으로 인도 할 수 있다면 매우 감사 할 것입니다. 이것이 어리석은 질문이라면 다시 미안합니다.

감사합니다.

답변

0

대부분의 경우 뷰는 기본 시퀀스에 대한 참조를 반환하지만 어딘가에는 너무 복잡해집니다 (실제로 오류 체인을 파고 들지 않았습니다).

일반적으로 더 간단한 시퀀스를 삽입하는 것이 도움이되는 것입니다. 사용

as_vector :

Live On Coliru

#include <boost/fusion/include/vector.hpp> 
#include <boost/fusion/include/zip_view.hpp> 
#include <boost/fusion/include/view.hpp> 

using namespace boost; 

int main() 
{ 
    typedef fusion::vector<int, int, int> Tuple3; 
    Tuple3 v1(1,2,3); 
    Tuple3 v2(4,5,6); 

    typedef fusion::vector<Tuple3&, Tuple3&> VVector; 
    VVector vv(v1,v2); 

    typedef fusion::zip_view<VVector> ZipView; 
    auto zv = fusion::as_vector(ZipView(vv)); 
    typedef fusion::flatten_view<decltype(zv)> FlattenView; 
    auto fv = FlattenView(zv); 

    // proof of the pudding: 
    auto first = fusion::begin(fv); 
} 
만의 모습에서, 컴파일러는 여전히 동일한 객체를 생성 할 수 있습니다 "나는 값을 복사 줄 수있는 경우에"

당신은 생각할 것이다 코드가 있으므로 최적화하기 전에 필요성을 확인하십시오.

+0

신속하고 유용한 답변을 보내 주셔서 감사합니다. 그게 내 문제를 완전히 해결 했으니 지금 중첩 된 견해는 더 이상 문제가되지 않습니다. – bch