C++ 获取mpl向量的前M个元素

C++ 获取mpl向量的前M个元素,c++,boost,template-meta-programming,boost-mpl,C++,Boost,Template Meta Programming,Boost Mpl,我有一个带有N元素的boost::mpl::vector,比如: typedef boost::mpl::vector<int,float,double,short,char> my_vector; 起初我想使用erase,但无法为first和last找到合适的模板参数。(我使用的是at_c::type)但是,据我所知,过滤器视图也可以用于此任务。最好的解决方法是什么?擦除是解决问题的合理方法 您想要的第一个值是mpl::begin的结果,该值根据您感兴趣返回的元素数而提前 您想

我有一个带有
N
元素的
boost::mpl::vector
,比如:

typedef boost::mpl::vector<int,float,double,short,char> my_vector;

起初我想使用
erase
,但无法为
first
last
找到合适的模板参数。(我使用的是
at_c::type
)但是,据我所知,
过滤器视图
也可以用于此任务。最好的解决方法是什么?

擦除是解决问题的合理方法

  • 您想要的第一个值是
    mpl::begin
    的结果,该值根据您感兴趣返回的元素数而提前
  • 您想要的end值是
    mpl::end
下面的代码假设,如果向量中的元素数量小于请求的数量,您希望元函数返回原始类型。还可以使用静态断言来验证输入整数类型是否小于或等于向量的大小

我提供了一个
first\u n\u elements
first\u n\u elements\u c
,前者接受一个整数

如果要使用视图,还可以在下面的代码中使用
迭代器\u 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 ;

};
#包括
#包括
#包括
#包括
#包括
#包括
名称空间mpl=boost::mpl;
名称空间详细信息
{
//注意,这是一个内部细节。请使用下面的结构
模板
结构删除\u后\u n
{
typedef typename mpl::begin::type begin\u iter;
typedef typename mpl::advance::type cut_iter;
typedef typename mpl::end::type end\u iter;
类型定义
typename mpl::erase::type type;
};
}
模板
结构优先元素
{
类型定义
如果,则typename mpl::eval\u,
T
详细信息::在\u n>之后删除\u::类型;
};
模板
结构优先元素
{
类型定义
typename first\u n\u元素::type type;
};

擦除是解决问题的合理方法

  • 您想要的第一个值是
    mpl::begin
    的结果,该值根据您感兴趣返回的元素数而提前
  • 您想要的end值是
    mpl::end
下面的代码假设,如果向量中的元素数量小于请求的数量,您希望元函数返回原始类型。还可以使用静态断言来验证输入整数类型是否小于或等于向量的大小

我提供了一个
first\u n\u elements
first\u n\u elements\u c
,前者接受一个整数

如果要使用视图,还可以在下面的代码中使用
迭代器\u 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 ;

};
#包括
#包括
#包括
#包括
#包括
#包括
名称空间mpl=boost::mpl;
名称空间详细信息
{
//注意,这是一个内部细节。请使用下面的结构
模板
结构删除\u后\u n
{
typedef typename mpl::begin::type begin\u iter;
typedef typename mpl::advance::type cut_iter;
typedef typename mpl::end::type end\u iter;
类型定义
typename mpl::erase::type type;
};
}
模板
结构优先元素
{
类型定义
如果,则typename mpl::eval\u,
T
详细信息::在\u n>之后删除\u::类型;
};
模板
结构优先元素
{
类型定义
typename first\u n\u元素::type type;
};