4

私は次の問題を抱えています:

template <int N, typename T>
/*what is the return type*/ nviewgetter( T const& t )
{

    typename T::const_iterator it(t.begin());

    typedef BOOST_TYPEOF_TPL(*it) etype;
    typedef typename boost::fusion::result_of::as_nview<etype, N>::type netype;
    std::vector<netype> r;

    while(it!=t.end()){
        r.push_back( boost::fusion::as_nview<N>(*it) );
        it++;
    }

    //return r;
}

予想されるのは、Tがフォワードシーケンスのシーケンス(例:boost ::fusion :: vector)であり、Tの各要素のN番目の要素のビューを取得したいということです。boost::fusion::vectorただし、例えば boost::fusion::vector<int, double>やの種類は事前にわかりませんboost::fusion::vector<int, double, std::string>。コードでは正しい型を理解できますが、関数宣言ではこれを理解できません。

ありがとう !

コード改善のための提案も歓迎します。:)

4

1 に答える 1

4

完全な型を書きたくない場合は、型定義を別のテンプレートに移動して、関数テンプレートを宣言するときに使用できるようにすることができます。何かのようなもの:

template <int N, typename T>
struct nviewgetter_traits
{
    typedef BOOST_TYPEOF_TPL(typename T::value_type) etype;
    typedef typename boost::fusion::result_of::as_nview<etype, N>::type netype;
    typedef std::vector<netype> result_type;

    // Or combine it into a single monstrosity if you prefer:
    // typedef std::vector<
    //    typename boost::fusion::result_of::as_nview<
    //        BOOST_TYPEOF_TPL(typename T::value_type), N
    //    >::type> result_type;
};

template <int N, typename T>
typename nviewgetter_traits<N,T>::result_type nviewgetter(T const & t)
{
    typename nviewgetter_traits<N,T>::result_type r;
    for (auto it = t.begin(); it != t.end(); ++it) {
        r.push_back( boost::fusion::as_nview<N>(*it) );
    }
    return r;
};
于 2011-12-08T13:00:11.747 に答える