2012-03-22 12 views
5

Creo que mi comprensión de boost :: mpl :: set debe ser fundamentalmente defectuosa. Pensé que solo permitía tipos únicos.por qué el conjunto boost mpl permite tipos no exclusivos

Pero el siguiente código 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

Es 'typedef set my_vec;' destinado a ser 'typedef vector my_vec;'? – Mankarse

+0

sí gracias por arreglar –

Respuesta

10

volver a examinar la documentation.

La lista de tipos T1, T2, T3, ..., TN utilizada para construir un conjunto no debe contener ningún duplicado. (O dicho de otro modo: el constructo set<T1, T2, ..., TN> solo tiene un significado bien definido si T1, T2, T3, ..., TN no contiene ningún duplicado).

Later on en la documentación no es un ejemplo de cómo construir un conjunto de una lista de elementos que puede contener duplicados:

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

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

Las invariantes conjunto solamente se aplican si se utiliza la interfaz de serie para crear el conjunto.

+0

Un punto interesante es que el resultado de 'fold <...> :: type' no es un' mpl :: set' sino 'boost :: mpl :: s_item >> ', también me falta algo. En Boost.Fusion esto se resuelve con la metafunción 'as_set' (http://www.boost.org/doc/libs/1_59_0/libs/fusion/doc/html/fusion/container/conversion/functions/as_set.html) , pero no puedo encontrar lo mismo en Boost MPL. – alfC

+0

Encontré la solución a mi comentario aquí: http://stackoverflow.com/questions/28585599/how-to-obtain-standard-mpl-sequence-after-fold – alfC

Cuestiones relacionadas