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?