为什么boost mpl set允许非唯一类型

时间:2012-03-22 10:23:31

标签: c++ boost metaprogramming boost-mpl

我相信我对 boost :: mpl :: set 的理解必然存在根本缺陷。我认为它只允许使用独特的类型。

但是下面的代码编译:

#include <boost/mpl/set.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/accumulate.hpp>
#include <boost/mpl/plus.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/assert.hpp>
using namespace boost::mpl;

typedef set<long,float,long> my_set; //long repeated in set?
typedef vector<long,float,long> my_vec; //seems reasonable

typedef accumulate<
  my_set
  , int_<0>
  , plus<_1, sizeof_<_2>>
  >::type set_size;

typedef accumulate<
  my_vec
  , int_<0>
  , plus<_1, sizeof_<_2>>
  >::type vec_size;

BOOST_MPL_ASSERT_RELATION( vec_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long) );
//why does the following line compile?
//shouldn't the size be sizeof(long)+sizeof(float) instead?
BOOST_MPL_ASSERT_RELATION( set_size::value, ==, sizeof(long)+sizeof(float)+sizeof(long) );

1 个答案:

答案 0 :(得分:10)

再看一下documentation

用于构造集合的类型T1, T2, T3, ..., TN列表不得包含任何重复项。 (换句话说,如果set<T1, T2, ..., TN>不包含任何重复项,T1, T2, T3, ..., TN构造只有明确定义的含义。

文档中的

Later on有一个如何从可能包含重复项的元素列表构造集合的示例:

typedef fold<
  vector<long,float,long>
, set0<>
, insert<_1,_2>
>::type s;

BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );

只有使用set接口创建集合时才会强制设置不变量。