2012-11-21 3 views
1

나는 융합 융합을 배우고 있고 std::vector<boost::fusion::vector<int,double,double> >을보기 위해 노력 중이다. 코드는 간단하지만 const와 관련된 몇 가지 문제가있는 것으로 보입니다. 나는 const에 관한 어떤 점을 분명히 오해하고 누군가가 내가 잘못 가고있는 곳을 설명하는 것을 좋아할 것입니다.boost 융합과 const 정확함

코드 :

template<int N, class T> 
struct viewTraits{ 
    typedef typename T::value_type etype; 
    typedef typename boost::fusion::result_of::as_nview<etype, N>::type netype; 
    typedef std::vector<netype> result_type; 
}; 

template <int N, typename T> 
typename viewTraits<N,T>::result_type c(T const &t) 
{ 
    typename viewTraits<N, T>::result_type retVal; 
    for (typename T::const_iterator it(t.begin());it<t.end();++it){ 
     retVal.push_back(fusion::as_nview<N>(*it)); 
    } 
    return retVal; 
} 

template <typename Container> 
typename Container::value_type sum(Container const &container) 
{ 
    typedef typename Container::value_type value_type; 
    return std::accumulate(container.begin(), container.end(), value_type()); 
} 

int main(){ 
    typedef fusion::vector<int, double, double>    row; 
    typedef std::vector<row>            container; 

    container x; 
    b(x, 200); 
    std::cout << sum(c<1>(x)) << std::endl; 
} 

코드 때문에 캐스팅 CONST에 문제의 retVal.push_back()에서 컴파일에 실패. 일부 const 키워드를 제거하고 추가하는 여러 순열을 시도했지만 순열에 의한 프로그래밍에 성공하지 못했고 내가하고있는 것을 이해하고 싶습니다.

누구든지 어떤 생각이 있습니까? 기능 정의가 sum이고 cconst은 그대로 있어야합니다.

편집 : 수정 된 코드 : 나는 bstd::vector<fusion::vector<int, double, double> >

EDIT2입니다 x 채우는 것을 언급하는 것을 잊었다

template<int N, class T> 
struct viewTraits{ 
    typedef typename T::value_type etype; 
    typedef typename fusion::result_of::as_nview<etype, N>::type netype; 
    typedef typename fusion::result_of::at_c<netype,0>::type reference; 
    typedef typename boost::decay<reference>::type value_type; 
    typedef std::vector<value_type> result_type; 
}; 

template <int N, typename T> 
typename viewTraits<N,T>::result_type c(T const &t) 
{ 
    typename viewTraits<N,T>::result_type retVal; 

    for(typename T::const_iterator it(t.begin()); it<t.end();++it){ 
     retVal.push_back(fusion::deref(fusion::begin(fusion::as_nview<N>(*it)))); 
    } 
    return retVal; 
} 
+0

'* (const T *) const'입니까? 'const_cast'를 사용하여 const를 버립니다. –

답변

1

코드 두 즉각적인 문제가 있습니다 : 당신이 fusion::as_nview<N>(*it)을 계산하고 그것이 fusion::result_of::as_nview<T::value_type, N>::type 인 것처럼 보관하려고

  • 는; 사실 fusion::result_of::as_nview<T::value_type const, N>::type (*it은 유형이 T::const_reference입니다.)입니다. 이것은 const 관련 오류의 출처입니다.

  • 결과보기를 누적하려고 시도하지만, the Fusion docs에서 알 수 있듯이 이러한보기의 유효한 연산은 대부분 Fusion Random Access Sequence의 연산입니다. 특히 두 개의 뷰를 함께 추가하거나 기본 뷰를 생성 할 수 없습니다. 다음은 가능한 수정에 리드 (NO 비록 유일한 방법 의미로), 실제로 테스트는 다음과 같습니다 add_viewslhs + at<0>(rhs)의 정신에 뭔가를 반환하는 펑터이다

    typedef typename Container::value_type view_type; 
    typedef typename fusion::result_of::at_c<view_type, 0>::type reference; 
    // boost::decay is from Boost.TypeTraits 
    typedef typename boost::decay<reference>::type value_type; 
    value_type zero = 0; 
    return std::accumulate(container.begin(), container.end(), zero, add_views()); 
    

    . c에 대한 길이보기가 정확히 1이되도록하려는 경우에만이 솔루션을 사용하는 것이 좋습니다.

+0

두 번째 사항에 대해서. 나는'sum' 메소드를 변경할 수 없지만'Container'의 타입을 변경할 수 있습니다. 아직 내 함수'c'에 맞도록 코드 스 니펫을 적용 할 수 없었습니다. 이견있는 사람? – rymurr

+0

팁 Luc을 주셔서 감사합니다. 귀하의 코드 스 니펫을 사용하여 내 질문을 정리할 수있었습니다. – rymurr

0

귀하의 Sequence 유형 T::value_type되지 않습니다, 그것은 const T::value_type입니다. typedef const typename T::value_type etype;을 작성하십시오.

+0

그 때문에 여러 가지 const 관련 컴파일 오류를 던진'fusion :: vector '형식이 변경되었습니다. – rymurr

+0

어떤 오류가 발생합니까? – ecatmur

+0

그들은 여기에 게시 하기엔 너무 깁니다 ... 많은 템플릿과 관련된 것들. 결론은 당신의 제안이 컴파일러가 기대하는'const fusion :: vector 대신에'fusion :: vector '을 만드는 것입니다. 당신의 제안에 기초한 순열에 의한 또 다른 시도는 정확한 유형을 산출하지 못했습니다. – rymurr