我有boost::mpl::vector
个N
元素,比如说:
typedef boost::mpl::vector<int,float,double,short,char> my_vector;
我希望获得包含M
的第一个my_vector
元素的序列。因此,如果M
为2,我想要一个:
typedef boost::mpl::vector<int,float> my_mvector;
最初我想过使用erase<s,first,last>
,但无法为first
和last
找出合适的模板参数。 (我使用at_c<...>::type
。)但是,我也理解filter_view
也可以用于任务。解决这个问题的最佳方式是什么?
答案 0 :(得分:3)
擦除是解决问题的合理方法。
mpl::begin<T>
的结果,它是您有兴趣返回的元素数量的增加。mpl::end<T>
如果向量中的元素数小于请求的数量,则下面的代码假定您希望元函数返回原始类型。也可以使用静态断言来验证输入整数类型是否小于或等于向量的大小。
我提供了一个first_n_elements
,它取一个MPL积分常数,first_n_elements_c
只取一个整数。
如果要使用视图,还可以在下面的代码中使用iterator_range<>
以及begin和cut迭代器。在这种情况下,我不确定一个优于另一个的优点。
#include <boost/mpl/vector.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/erase.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/less.hpp>
namespace mpl = boost::mpl;
namespace detail
{
// Note, this is an internal detail. Please use the structures below
template <typename T, typename N>
struct erase_after_n
{
typedef typename mpl::begin<T>::type begin_iter;
typedef typename mpl::advance<begin_iter, N>::type cut_iter;
typedef typename mpl::end<T>::type end_iter;
typedef
typename mpl::erase< T,cut_iter, end_iter >::type type;
};
}
template <typename T, typename N>
struct first_n_elements
{
typedef
typename mpl::eval_if< mpl::less < mpl::size<T>, N >,
T,
detail::erase_after_n<T, N> >::type type;
};
template <typename T, int N>
struct first_n_elements_c
{
typedef
typename first_n_elements<T, mpl::int_<N> >::type type ;
};