2012-03-22 16 views
5

boost :: mpl :: setの理解には根本的に欠陥があるはずです。私はそれがユニークな型だけを許したと思った。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)); 
+0

'typedef set my_vec;は' typedef vector my_vec; 'になりますか? – Mankarse

+0

ありがとうございました –

答えて

10

documentationで再度確認してください。

セットを構成するために使用されるタイプT1, T2, T3, ..., TNのリストは、重複を含んではいけません。 (または別の言い方をすれば、T1, T2, T3, ..., TNに重複が含まれていない場合、set<T1, T2, ..., TN>構造体は明確な意味しか持たない)。ドキュメントの

Later on重複が含まれていてもよい要素のリストからセットを作成する方法の例があります:

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

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

作成するセット・インタフェースを使用する場合、設定された不変量のみが適用されますセット。

+0

興味深いことに、 'fold <...> :: type'の結果は' mpl :: set'ではなく 'boost :: mpl :: s_item > '、私はまた何かを見逃しています。 Boost.Fusionでは、これは 'as_set'メタ関数(http://www.boost.org/doc/libs/1_59_0/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html)で解決されています。しかし、私はBoost MPLで同じものを見つけることができません。 – alfC

+0

ここに私のコメントへの解決策が見つかりました:http://stackoverflow.com/questions/28585599/how-to-obtain-standard-mpl-sequence-after-fold – alfC

関連する問題