时代是解决你问题的合理办法。
- The value you want for first is the result of
mpl::begin<T>
which is advanced by the number of elements you are interested in returning.
- The value you want for end is the result of
mpl::end<T>
下面的守则假定,如果病媒中的元素数量少于要求的数量,那么你就希望能恢复原类型。 也可以用静态的断言来核实投入的整体类型低于或等于病媒的规模。
我引申了一张<代码>第一_n_elements,该编码含有一种MPL的固定不变和first_n_elements_c
,后者简单地采用了一种分类。
如果你想使用一种观点,你也可以使用<代码>iterator_range<>以及以下代码中的起始和切割器。 我不敢肯定本案的利弊。
#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 ;
};