C++:七転八倒記(3項演算子)

自戒と備忘録を兼ねて。

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 コメント: