MW_*_*dev 5 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) );
Run Code Online (Sandbox Code Playgroud)
Man*_*rse 10
再看一下文档.
T1, T2, T3, ..., TN用于构造集的类型列表不得包含任何重复项.(或换句话说 - set<T1, T2, ..., TN>如果T1, T2, T3, ..., TN不包含任何重复,则构造仅具有明确定义的含义).
稍后在文档中有一个示例,说明如何从可能包含重复项的元素列表构造集合:
typedef fold<
vector<long,float,long>
, set0<>
, insert<_1,_2>
>::type s;
BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );
Run Code Online (Sandbox Code Playgroud)
只有使用set接口创建集合时,才会强制执行set不变量.
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |