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?
Gracias! Eso funcionó, usando el perezoso si tiene sentido pero realmente no entiendo por qué necesitas la identidad y extract_element_type ? –
grivescorbett
@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
Ahh, esta es la primera vez que uso MPL, ¿quién sabía que podría ser tan complicada? – grivescorbett