如何找出nviews向量的返回类型

How to figure out the return type of a vector of nviews

本文关键字:返回类型 向量 nviews 何找出      更新时间:2023-10-16

我有以下问题:

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>。在代码中,我可以找出正确的类型,但我不能在函数声明中找出这一点。

谢谢!

也欢迎对代码改进提出任何建议。:)

如果你不想写出完整的类型,你可以将类型定义移动到一个单独的模板中,这样当你声明函数模板时它们就可用了;比如:

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