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