我有以下问题:
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/