Правильная подпись / обнаружение присутствия Container :: reserve ()

Учитывая типC который является контейнером, соответствующим STL, как правильно определить,C содержит функцию-членreserve? Я попробовал следующий подход (с 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
{};

Это работает дляC являющийсяstd::vectorно не для неупорядоченных контейнеров, напримерstd::unordered_set, Причина в том, чтоreserve является (прямой) функцией-членомstd::vector, но для неупорядоченных контейнеров он наследуется от базового класса, то есть его подпись неvoid (C::*)( typename C::size_type ) ноvoid (B::*)( typename C::size_type ) для некоторого неопределенного базового классаB изC

Я знаю, как обойти это и обнаружитьreserve даже если наследуется, но выглядит неуклюже и мне интересно, что разрешено стандартом. Так...

Мой вопрос: позволяет ли стандартreserve быть унаследованным от неопределенного базового класса или это синопсис обязательный и требует прямой функции-члена?

Ответы на вопрос(1)

Ваш ответ на вопрос