2012-05-24 8 views
7

Mam więc klasę szablonów, którą chciałbym zaakceptować std :: map, gdzie typem danych jest surowy wskaźnik lub std :: unique_ptr. Następnie w tej klasie chciałbym uzyskać typu bazowego wskaźnika:Ocena metaprogramowania szablonu

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 

Jednak pojawia się następujący błąd przy uruchamianiu klasę za pomocą mapy z surowego rodzaju palików:

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

It wydaje mi się, że jest to ocena typename Container::mapped_type::element_type* na surowym wskaźniku, myślałem, że przy metaprogramowaniu szablonowym nie oceni tego, kiedy if_ się powiedzie. Czy powinienem to robić w inny sposób?

Odpowiedz

11

trzeba leniwyif – spróbować boost::mpl::eval_if zamiast 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; 
}; 

Tj, w razie wątpliwości, należy dodać dodatkową warstwę zadnie.

+1

Dzięki! To działało, używając leniwych, jeśli ma sens, ale tak naprawdę nie rozumiem, dlaczego potrzebujesz tożsamości i extract_element_type ? – grivescorbett

+1

@grivescorbett: Zamiast typów bezpośrednio takich jak 'if_',' eval_if' przyjmuje unarne metafunkcje, które _produce_ types. Ta leniwa ocena/tworzenie instancji wspomnianych metafunkcji jest tym, co sprawia, że ​​działa ona tak, jak tego potrzebujesz. – ildjarn

+1

Ahh, to jest mój pierwszy kontakt z MPL, który wiedział, że może być tak zawiłe? – grivescorbett