En https://stackoverflow.com/a/1967183/134841, se proporciona una solución para el control de estáticamente si existe un miembro, posiblemente en una subclase de un tipo:Comprobación existe un miembro, posiblemente en una clase base, C++ versión 11
template <typename Type>
class has_resize_method
{
class yes { char m;};
class no { yes m[2];};
struct BaseMixin
{
void resize(int){}
};
struct Base : public Type, public BaseMixin {};
template <typename T, T t> class Helper{};
template <typename U>
static no deduce(U*, Helper<void (BaseMixin::*)(), &U::foo>* = 0);
static yes deduce(...);
public:
static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0)));
};
Sin embargo , no funciona en C++ 11 final
clases, porque hereda de la clase bajo prueba, que final
previene.
otoh, éste:
template <typename C>
struct has_reserve_method {
private:
struct No {};
struct Yes { No no[2]; };
template <typename T, typename I, void(T::*)(I) > struct sfinae {};
template <typename T> static No check(...);
template <typename T> static Yes check(sfinae<T,int, &T::reserve> *);
template <typename T> static Yes check(sfinae<T,size_t,&T::reserve> *);
public:
static const bool value = sizeof(check<C>(0)) == sizeof(Yes) ;
};
no puede encontrar el método reserve(int/size_t)
en baseclasses.
¿Existe una implementación de este metafunción que tanto reserved()
encuentra en baseclasses de T
y todavía funciona si T
es final
?
En C++ 11 puede simplemente usar "sfinae para expresiones" en lugar de hacer esta rotonda necesaria en C++ 03. –
@ JohannesSchaub-litb ¡Solicitud de solución! Me encantaría ver la diferencia que hace para este tipo de ejemplo. – stinky472