2012-03-22 14 views
5

Credo che la mia comprensione di boost :: mpl :: set debba essere fondamentalmente difettosa. Pensavo che permettesse solo tipi unici.perché il boost di mpl set consente tipi non univoci

Ma il seguente codice compila:

#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;' pensato per essere 'typedef vector my_vec;'? – Mankarse

+0

sì grazie per il fixing –

risposta

10

Guardate ancora il documentation.

L'elenco dei tipi T1, T2, T3, ..., TN utilizzato per costruire un set non deve contenere duplicati. (O in modo diverso - il costrutto set<T1, T2, ..., TN> ha un significato ben definito se T1, T2, T3, ..., TN non contiene duplicati).

Later on nella documentazione non è un esempio di come costruire un insieme da un elenco di elementi che possono contenere duplicati:

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

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

Le invarianti impostati vengono applicati solo se si utilizza l'interfaccia insieme per creare il impostato.

+0

Un punto interessante è che il risultato di 'fold <...> :: type' non è un 'mpl :: set' ma' boost :: mpl :: s_item >> ', mi manca anche qualcosa. In Boost.Fusion questo è risolto con la metafunzione 'as_set' (http://www.boost.org/doc/libs/1_59_0/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html) , ma non riesco a trovare lo stesso in Boost MPL. – alfC

+0

Trovato la soluzione per il mio commento qui: http://stackoverflow.com/questions/28585599/how-to-obtain-standard-mpl-sequence-after-fold – alfC

Problemi correlati