Corrigir assinatura de / detectar presença de Container :: reserve ()

Dado um tipoC que é um contêiner em conformidade com STL, como faço para detectar corretamente seC contém uma função de membroreserve? Eu tentei a seguinte abordagem (com o 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
{};

Isso funciona paraC serstd::vector, mas não para os recipientes não desordenados, e.std::unordered_set. A razão é quereserve é uma função de membro (direto)std::vector, mas para os recipientes não-ordenados é herdada de uma classe base, ou seja, sua assinatura não évoid (C::*)( typename C::size_type ) masvoid (B::*)( typename C::size_type ) para alguma classe base não especificadaB doC.

Eu sei como contornar isso e detectarreserve mesmo se herdado, mas parece desajeitado e me pergunto o que é permitido pelo padrão. Assim...

Minha pergunta é: o padrão permitereserve ser herdado de uma classe base não especificada ou é a sinopse de ligação e requer uma função de membro direta?

questionAnswers(1)

yourAnswerToTheQuestion