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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta