Firma correcta de / detectar presencia de Contenedor :: reserve ()
Dado un tipoC
que es un contenedor conforme a STL, ¿cómo detecto correctamente siC
contiene una función miembroreserve
? Probé el siguiente enfoque (con GCC 4.6.3):
template< typename C, typename = void >
struct has_reserve
: std::false_type
{};
template< typename C >
struct has_reserve< C, typename std::enable_if<
std::is_same<
decltype( &C::reserve ),
void (C::*)( typename C::size_type )
>::value
>::type >
: std::true_type
{};
Esto funciona paraC
siendostd::vector
, pero no para los contenedores desordenados, por ejemplo,std::unordered_set
. La razón es quereserve
es una función miembro (directa) destd::vector
, pero para los contenedores desordenados se hereda de una clase base, es decir, su firma no esvoid (C::*)( typename C::size_type )
perovoid (B::*)( typename C::size_type )
para alguna clase base no especificadaB
deC
.
Sé cómo solucionarlo y detectar.reserve
incluso si se hereda, pero parece torpe y me pregunto qué está permitido por el estándar. Asi que...
Mi pregunta es: ¿Permite el estándarreserve
para ser heredado de una clase base no especificada o es la sinopsis vinculante y requiere una función de miembro directo?