2011-11-14 79 views
0

的第一M個元素我有一個與boost::mpl::vector元素N,說:獲得一個MPL矢量

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

我希望獲得含my_vector第一M元件的序列。所以,如果M是2我想出來一個:

typedef boost::mpl::vector<int,float> my_mvector; 

起初我想用erase<s,first,last>的,但無法找出合適的模板參數firstlast。 (我正在使用at_c<...>::type。)但是,這也是我的理解,filter_view也可以用於任務。什麼是最好的方式去做這件事?

回答

3

擦除是您的問題的合理解決方案。

  • 您想要的值首先是mpl::begin<T>的結果,它由您感興趣返回的元素的數量推進。
  • 要用於端的值是mpl::end<T>

結果下面的代碼假定所需的元函數,返回原來的類型,如果在載體中元件的數量小於所請求的數量。也可以使用靜態斷言來驗證輸入整型是否小於或等於向量的大小。

我提出了一個採用MPL積分常數的first_n_elements和只需要一個整數的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 ; 

};