c++ - 如何找出 nviews vector 的返回类型

标签 c++ boost boost-fusion

我有以下问题:

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

关于c++ - 如何找出 nviews vector 的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8431199/

相关文章:

c++ - 为构造的 std::vector 中的每个元素调用默认构造函数

c++ - 在 IOS 上打印漂亮的大数字 C++

c++ - 使用 Boost Spirit 和 Fusion 以关联方式解析结构

c++ - 在 boost::spirit::karma 中使用 boost::fusion::map

c++ - 运行时和融合序列之间的交互

c++ - 如何动态调整二维 vector 的大小?

C++ - RegCreateKeyEx 成功但没有结果

c++ - 指向结构的指针的 Typedef 等价

c++ - 使用 boost::multi_index_container