現在、次のものをコンパイルしようとしています。
class foo {
};
class bar {
public:
const foo & to_foo() const {
return f;
}
foo & to_foo() {
return f;
}
private:
foo f;
};
template< typename T, typename Enable = void >
class convert {};
template< typename T >
struct convert< T, typename std::enable_if< std::is_member_function_pointer< decltype( &T::to_foo ) >::value >::type > {
static const foo & call1( const bar & b ) {
return b.to_foo();
}
static foo & call2( bar & b ) {
return b.to_foo();
}
};
ただし、特殊化は 2 つの可能なto_foo()
メンバーの存在によって混乱するため、デフォルトのケースが選択されます。to_foo()
メンバーの 1 つを削除するとすぐにcallX()
機能しますが、constness と一致しないため、メソッドの 1 つが失敗します。
この場合、この機能を検出する方法はありますか?
編集:
以下は ideone の例です: http://ideone.com/E6saX
メソッドの 1 つを削除すると、問題なく動作します: http://ideone.com/iBKoN