Poprawny podpis / wykrycie obecności kontenera :: rezerwa ()
Dany typC
który jest kontenerem zgodnym z STL, jak prawidłowo wykryć, czyC
zawiera funkcję członkareserve
? Próbowałem następującego podejścia (z 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
{};
To działa naC
istotastd::vector
, ale nie dla nieuporządkowanych pojemników, np.std::unordered_set
. Powód jest taki, żereserve
jest (bezpośrednią) funkcją członkastd::vector
, ale dla kontenerów nieuporządkowanych jest dziedziczona z klasy bazowej, tj. jej podpis nie jestvoid (C::*)( typename C::size_type )
alevoid (B::*)( typename C::size_type )
dla jakiejś nieokreślonej klasy bazowejB
zC
.
Wiem, jak to obejść i wykryćreserve
nawet jeśli odziedziczone, ale wygląda niezgrabnie i zastanawiam się, co jest dozwolone przez standard. Więc...
Moje pytanie brzmi: czy standard na to pozwalareserve
być dziedziczonym z nieokreślonej klasy bazowej lub czy powiązanie streszczenia i wymaga bezpośredniej funkcji składowej?