Правильная подпись / обнаружение присутствия 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
быть унаследованным от неопределенного базового класса или это синопсис обязательный и требует прямой функции-члена?