【问题标题】:why does boost mpl set allow non-unique types为什么 boost mpl set 允许非唯一类型
【发布时间】:2012-03-22 10:23:31
【问题描述】:

我相信我对 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) );

【问题讨论】:

  • typedef set&lt;long,float,long&gt; my_vec; 是否意味着typedef vector&lt;long,float,long&gt; my_vec;
  • 是的,谢谢您的修复

标签: c++ boost metaprogramming boost-mpl


【解决方案1】:

再看documentation

用于构造集合的类型列表T1, T2, T3, ..., TN 不得包含任何重复项。 (或者换一种说法——set&lt;T1, T2, ..., TN&gt; 结构只有在 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 接口创建集合时,才会强制执行集合不变量。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 2013-01-01
  • 2012-09-14
相关资源
最近更新 更多