STL準拠のコンテナであるタイプの場合、メンバー関数が含まれているCかどうかを正しく検出するにはどうすればよいですか?私は次のアプローチを試しました(GCC 4.6.3で):Creserve
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、指定されていない基本クラスから継承することを許可しますか、それとも概要をバインドし、直接メンバー関数を必要としますか?