我正在学习助推融合,并试图了解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;
}
由于编译const的问题,代码无法在retVal.push_back()
进行编译。我尝试了删除和添加一些const关键字的几种排列,但是在排列编程方面没有成功,而是宁愿理解我在做什么。
有人有什么想法吗?请注意const
和sum
的函数定义中的c
必须保留。
编辑:我忘了提及b
填充x
std::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;
}
答案 0 :(得分: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随机访问序列。特别是您不能将两个视图一起添加,或默认构造一个。这是导致可能的修复(但绝不是唯一的方法),而不是实际测试:
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());
其中add_views
是一个以lhs + at<0>(rhs)
精神返回内容的仿函数。请注意,如果您打算c
使长度的视图恰好为1,那么此解决方案才有意义。
答案 1 :(得分:0)
Sequence
类型不是T::value_type
,而是const T::value_type
。尝试写typedef const typename T::value_type etype;
。