2012-03-22 18 views
5

desteği :: mpl :: set temelde kusurlu olması gerektiğine inanıyorum. Sadece benzersiz türlere izin verdiğini düşündüm.neden mpl kümesi, benzersiz olmayan türlere izin veriyor

Ama şu kod derler:

#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 vektörü my_vec; – Mankarse

+0

evet –

cevap

10

Bak yine documentation de.

Bir küme oluşturmak için kullanılan T1, T2, T3, ..., TN türlerinin listesi hiçbir çoğaltma içermemelidir. (Ya da farklı olarak koydu - T1, T2, T3, ..., TN, çoğaltmaları içermiyorsa, set<T1, T2, ..., TN> yapısının yalnızca iyi tanımlanmış bir anlamı vardır). belgelerinde

Later on çiftleri ihtiva edebilir elemanların listesinden bir dizi oluşturmak için nasıl bir örnek vardır:

oluşturmak grubu arayüzü kullanmak durumunda grubu değişmezler sadece uygulanır
typedef fold< 
    vector<long,float,long> 
, set0<> 
, insert<_1,_2> 
>::type s; 

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

ayarlayın.

+0

'u düzeltdiğiniz için teşekkür ederiz. <...> :: type 'katsayısının sonucu bir" mpl :: set "değil," boost :: mpl :: s_item >> 'Ben de bir şey özlüyorum. Boost.Fusion'da bu "as_set" metafonksiyonu ile çözülür (http://www.boost.org/doc/libs/1_59_0/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html) ama Boost MPL'de aynı şeyi bulamıyorum. – alfC

+0

Benim yorumumu buraya çözüm bulundu: http://stackoverflow.com/questions/28585599/how-to-obtain-standard-mpl-sequence-after-fold – alfC

İlgili konular