如果我使用boost :: mpl,请看下面的代码:
typedef fold<
vector<long,float,long>
, set0<>
, insert<_1,_2>
>::type s;
BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );
如何将s
再次转换为t = boost::mpl::set<long,float>
类型,以便我可以使用t
选择部分专用的模板函数(在boost :: mpl :: set``上)提取元素类型并将其转换为std::tuple<long,float>
。这是其他的东西
答案 0 :(得分:1)
这是一个完整的例子。我调用了元函数Unify
,但显然你可以随意调用它
它是如何工作的非常简单,它只是一次一个地从输入序列中删除元素,并构建一个可变列表并在最后将它们转储到所需的序列类型。
#include <boost/mpl/set.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/erase_key.hpp>
#include <tuple>
template <template <class...> class OutSeqType,
class Sequence,
std::size_t nSeqSize,
class ... Elements>
struct Unify
{
typedef typename boost::mpl::front<Sequence>::type Next;
typedef typename Unify<
OutSeqType,
typename boost::mpl::erase_key<Sequence, Next>::type,
nSeqSize - 1, Next, Elements...>::type type;
};
template <template <class...> class OutSeqType,
class Sequence,
class ... Elements>
struct Unify<OutSeqType, Sequence, 0ul, Elements...>
{
typedef OutSeqType<Elements...> type;
};
int main()
{
typedef boost::mpl::insert<
boost::mpl::insert<
boost::mpl::insert<
boost::mpl::set<>,
int>::type,
float>::type,
int*>::type Set;
typedef Unify<
std::tuple,
Set,
boost::mpl::size<Set>::type::value
>::type Set2;
//This compile error will print the type of Set2
Set2::asdfl;
}
出于某种原因,我不确定我是否pop_front
使用set
,因此我使用erase_key
代替{{1}}。这将它限制为关联容器,但它可以推广到任何类型的容器,只需要更多的工作。我会把它留作练习。