Korrekte Unterschrift von / Vorhandensein von Container :: reserve () erkennen

Gegeben ein TypC Was ist ein STL-konformer Container? Wie erkenne ich, obC enthält eine Mitgliedsfunktionreserve? Ich habe den folgenden Ansatz ausprobiert (mit 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
{};

Das funktioniert fürC Seinstd::vector, aber nicht für ungeordnete Behälter, z.std::unordered_set. Der Grund ist, dassreserve ist eine (direkte) Mitgliedsfunktion vonstd::vector, aber für die ungeordneten Container wird es von einer Basisklasse geerbt, d. h. seine Signatur ist es nichtvoid (C::*)( typename C::size_type ) abervoid (B::*)( typename C::size_type ) für einige nicht spezifizierte BasisklassenB vonC.

Ich kann es umgehen und erkennenreserve auch wenn geerbt, aber es sieht ungeschickt aus und ich frage mich, was der Standard erlaubt. So...

Meine Frage ist: Lässt der Standard zureserve von einer nicht spezifizierten Basisklasse geerbt werden oder ist die Synopse bindend und erfordert eine direkte Member-Funktion?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage