2012-05-24 15 views
7

Así que tengo una clase de plantilla que me gustaría aceptar un std :: map donde el tipo de datos es un puntero sin formato o un std :: unique_ptr. A continuación, en esta clase me gustaría obtener el tipo del puntero subyacente:evaluación de metaprogramación de la plantilla

typedef typename boost::mpl::if_< 
    boost::is_pointer<typename Container::mapped_type>, 
    typename Container::mapped_type, 
    typename Container::mapped_type::element_type* 
>::type data_type 

Sin embargo, me sale el siguiente error al crear instancias de la clase utilizando un mapa con un tipo de puntero prima:

error: 'std::map<int, ValueType*>::mapped_type {aka ValueType*}' is not a class, struct, or union type 

Se me parece que está evaluando typename Container::mapped_type::element_type* en el puntero sin procesar, pensé que con la metaprogramación de la plantilla no se evaluaría eso cuando el if_ tuviera éxito. ¿Debería ir sobre esto de otra manera?

Respuesta

11

Se necesita un vago if – tratar boost::mpl::eval_if en lugar de boost::mpl::if_:

#include <boost/type_traits/is_pointer.hpp> 
#include <boost/mpl/eval_if.hpp> 
#include <boost/mpl/identity.hpp> 

template<typename T> 
struct extract_element_type 
{ 
    typedef typename T::element_type* type; 
}; 

template<typename Container> 
struct foo 
{ 
    typedef typename boost::mpl::eval_if< 
     boost::is_pointer<typename Container::mapped_type>, 
     boost::mpl::identity<typename Container::mapped_type>, 
     extract_element_type<typename Container::mapped_type> 
    >::type data_type; 
}; 

es decir, en caso de duda, añadir un nivel adicional de indirección.

+1

Gracias! Eso funcionó, usando el perezoso si tiene sentido pero realmente no entiendo por qué necesitas la identidad y extract_element_type ? – grivescorbett

+1

@grivescorbett: en lugar de tipos directamente como 'if_',' eval_if' toma metafunciones únicas que _producen_ tipos. Esa evaluación/instanciación lenta de dichas metafunciones es lo que hace que funcione de la manera que usted necesita. – ildjarn

+1

Ahh, esta es la primera vez que uso MPL, ¿quién sabía que podría ser tan complicada? – grivescorbett

Cuestiones relacionadas