Как выяснить тип возвращаемого вектора nviews - PullRequest
4 голосов
/ 08 декабря 2011

У меня следующая проблема:

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), и я хочу получить представление о N-м элементе в каждом элементе T. Однако я не знаю заранее типа boost::fusion::vector, например, boost::fusion::vector<int, double> или boost::fusion::vector<int, double, std::string>. В коде я могу определить правильный тип, но я не могу понять это в объявлении функции.

Спасибо!

Любые предложения по улучшению кода также приветствуются. :)

1 Ответ

4 голосов
/ 08 декабря 2011

Если вы не хотите записывать полный тип, вы можете переместить определения типов в отдельный шаблон, чтобы они были доступны при объявлении шаблона функции; что-то вроде:

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