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?