ブーストフュージョンを学んでいて、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
の関数定義にあり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;
}