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?
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
@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
Ahh, to jest mój pierwszy kontakt z MPL, który wiedział, że może być tak zawiłe? – grivescorbett