1

ブーストフュージョンを学んでいて、std::vector<boost::fusion::vector<int,double,double> >. コードは単純に見えますが、const でいくつかの問題が発生しているようです。私は明らかに 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;
}

retVal.push_back()const のキャストに問題があるため、コードは でコンパイルできません。いくつかの const キーワードを削除および追加するいくつかの順列を試しましたが、順列によるプログラミングはうまくいきませんでした。

誰にも考えはありますか?ところで、constの関数定義にありsumcとどまる必要があります。

b編集:私はそれが満たされていることを言及するのを忘れていましxstd::vector<fusion::vector<int, double, double> >

EDIT2:修正されたコード:

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;
}
4

2 に答える 2

1

コードには差し迫った問題が 2 つあります。

  • 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( *ithas type T::const_reference) です。これがconst- 関連のエラーの原因です。

  • 結果のビューを蓄積しようとしますが、Fusion docsからわかる限り、そのようなビューに対する有効な操作は、ほとんどが Fusion Random Access Sequence の操作です。特に、2 つのビューを一緒に追加したり、デフォルトで 1 つを構築したりすることはできません。これは、実際にテストされていない、可能な修正へのリードです(決して唯一の方法ではありません):

    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());
    

    whereadd_viewsは の精神で何かを返すファンクターですlhs + at<0>(rhs)。この解決策はc、長さのビューを正確に 1 つにすることを意図している場合にのみ意味があることに注意してください。

于 2012-11-21T11:36:08.140 に答える
0

あなたのSequenceタイプは ではありませT::value_typeconst T::value_type。書いてみてくださいtypedef const typename T::value_type etype;

于 2012-11-21T10:44:31.943 に答える