C++ 使用boost mpl pop_front

C++ 使用boost mpl pop_front,c++,boost,boost-mpl,C++,Boost,Boost Mpl,具有: #include <typeinfo> #include <boost/mpl/vector.hpp> #include <boost/mpl/pop_front.hpp> int main() { typedef boost::mpl::vector<char,short,int,long,long long> v; typedef typename pop_front<v>::type poped; } #

具有:

#include <typeinfo>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/pop_front.hpp>
int main()
{
    typedef boost::mpl::vector<char,short,int,long,long long> v;
    typedef typename pop_front<v>::type poped;
}
#包括
#包括
#包括
int main()
{
typedef boost::mpl::vector v;
typedef typename pop_front::type poped;
}
问题是poped不等于boost::mpl::vector,而等于:boost::mpl::v_mask>


如何在没有第一个元素的情况下返回向量?

我不确定使用MPL功能是否可行。即使您尝试使用
copy
back\u inserter
popped
复制到
向量
,您也会再次获得一个不是真正的
向量
的类型。这是通过设计实现的:与Boost.Fusion一样,MPL的算法和元函数返回原始序列的视图,提供延迟评估。这些视图可以像原始序列一样使用,因此您不必担心它们的实际类型,只需将它们当作
vector
(或
list
s,或
map
s等)来使用即可。

也许mpl::equal可以帮助您澄清为什么这一点都不重要

只要确保它是相等的,但不一定相同

BOOST_MPL_ASSERT((mpl::equal<
    typename pop_front<v>::type,
    mpl::vector<short,int,long,long long>
>));
BOOST\u MPL\u ASSERT((MPL::equal)<
typename pop_front::type,
向量
>));

这就是你真正需要的;-)

你为什么关心结果的确切类型是什么?它的行为就像一个
mpl::vector
,你可以把它当作一个,那么有什么区别呢?@ildjarn只是好奇,好奇没什么不好的,是吗?绝对不是!:-]我只是想知道这到底给你带来了什么问题。