TR1 を使用しstd::function
て単純なコールバック メカニズムを実装しています。コールバックされたくない場合はnullptr
、コールバック ハンドラとして登録します。これはコンパイルされ、正常に動作します:
void Foo::MessageHandlingEnabled( bool enable ){
if( enable )
m_Bar.RegisterMessageHandler( std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) );
else
m_Bar.RegisterMessageHandler( nullptr );
}
これを三項演算子で書き直すと・・・
void Foo::MessageHandlingEnabled( bool enable ){
m_Bar.RegisterMessageHandler( enable?
std::bind(&Foo::BarMessageHandler, this, std::placeholders::_1) :
nullptr );
}
... VC++ のコンパイラは次のように述べています。
エラー C2446: ':': 'nullptr' から 'std::tr1::_Bind<_Result_type,_Ret,_BindN>' 1> への変換がありません 1>
[ 1> _Result_type=void, 1> _Ret=void, 1>
_BindN=std::tr1::_Bind2,Foo *,std::tr1::_Ph<1>> 1> ] 1> ソース型を取得できるコンストラクターがないか、コンストラクターのオーバーロード解決があいまいです
これはコンパイラの制限ですか、それとも私は愚かなことをしていますか? この特定のケースでは、三項演算子を使用しても何のメリットも得られないことはわかっていますが、ただ興味があります。