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?

questionAnswers(1)

yourAnswerToTheQuestion