自戒と備忘録を兼ねて。
VC2008sp1から、std::tr1::bindが使えるようになりました。
これに関して"とてもしょーもないこと"でハマったので、忘れないように記録しておきます。
using namespace std;
using namespace std::tr1::placeholders;
bool b( false );
//なんか操作
tr1::function<> f = b
? tr1::bind( minus<>(), _1, 100 )
: tr1::bind( plus<>(), _1, 100 ); //Error!
(つд’)ゴシゴシ
(;゚ Д゚) …!?
ま、すぐにピンときました。
"3項演算子の2項目と3項目は相互に代入可能でなければならない"からですね。
有名な例だと、
class B {};
class D1 : public B {};
class D2 : public B {};
bool b( false );
//なんか操作
D1 d1;
D2 d2;
B* pb = b ? &d1 : &d2; //Error!
こんなのがあります。
上の例では &d1 &d2 をstatic_castで基底クラスにキャストすればOKですね。
・・・ちなみに、最初の例ではbindで束縛した結果をいったんtr1::functionで受けておいてから3項演算にかければ良いです。
未来の私へ伝言:
auto a =
? [](){ return 100; }
: [](){ return 1000; };
はエラーになりますよー。
0 コメント:
コメントを投稿