1

我正在学习 boost fusion,并试图了解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,函数定义中的sumandc必须保留。

编辑:我忘了提到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

您的代码有两个直接问题:

  • 您计算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-related 错误的来源。

  • 您尝试累积结果视图,但是,据我所知,从Fusion 文档中可以看出,此类视图上的有效操作主要是 Fusion 随机访问序列的操作。特别是您不能将两个视图添加在一起,或者默认构造一个。这是一个可能的修复方法(但绝不是唯一的方法),但未经过实际测试:

    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请注意,只有当您打算将长度视图设为一个时,此解决方案才真正有意义。

于 2012-11-21T11:36:08.140 回答
0

你的Sequence类型不是T::value_type,它是const T::value_type。尝试写作typedef const typename T::value_type etype;

于 2012-11-21T10:44:31.943 回答