C++訳分からなすぎワロタ (1) if文でスコープを作れる
#include <iostream> #include <stdexcept> #include <memory> using namespace std; class SpaceObject { public: virtual void Kaboom(SpaceObject *pObject) = 0; }; class Meteorite; class SpaceShip : public SpaceObject { public: virtual void Kaboom(SpaceObject *pObject); protected: void Kaboom(SpaceShip &other) { cout << "SpaceShip with SpaceShip" << endl; } void Kaboom(Meteorite &other) { cout << "SpaceShip with Meteorite" << endl; } }; class Meteorite : public SpaceObject { public: virtual void Kaboom(SpaceObject *pObject) { throw logic_error("unimplemented"); } }; void SpaceShip::Kaboom(SpaceObject *pObject) { if (SpaceShip *pShip = dynamic_cast<SpaceShip*>(pObject)) { Kaboom(*pShip); } else if (Meteorite *pMeteo = dynamic_cast<Meteorite*>(pObject)) { Kaboom(*pMeteo); } else { throw logic_error("Maybe we have found an UFO."); } } int main() { auto_ptr<SpaceObject> pObj1(new SpaceShip), pObj2(new Meteorite); pObj1->Kaboom(&*pObj2); pObj1->Kaboom(&*pObj1); }
↓
SaceShip with Meteorite SpaceShip with SpaceShip
ポインタに限らず operator bool()
と代入形式のctorが使えるクラスなら,任意のオブジェクトを定義できるみたい.こういうのって規格のどこに載ってるんだ...? 内部クラスを含む,関数呼び出し形式のctorでは(例え代入形式がコンパイル通っても)駄目みたいだ.微妙だ...
いや,言いたかったのは,C++って言うと
for (int i = 0; i < 10; ++i) cout << "i=" << i << endl;
この i
がfor文ローカルになるのはかなり有名だと思うが,それだけじゃなかったYO ということだ.ついでにfor文の第2スロットでも変数が定義できた...
#include <iostream> using namespace std; class Until5 { int x; public: Until5(int x) : x(x) { } int getX() { return x; } operator bool() { return x<5; } }; class Incer { public: Incer(int &x) { ++x; } }; int main() { for (int i(0); Until5 u5 = i; Incer /* inc = */ (i)) cout << "i=" << u5.getX() << endl; }
↓
i=0 i=1 i=2 i=3 i=4
何が何やら.残念ながら(コメントアウトしてあるが)第3スロットでは変数は定義できなかった.上のコードはコメントアウトにより,単なる一時オブジェクトの生成である.(STL iteratorの ++i
でない i++
みたいなもんだ)
どうせならC#の using
相当を付けて欲しかった... 単なる中括弧で済むので絶対に入ることはなかろうけど,意図の問題なんだよ!
なお多重ディスパッチについては Sutter, More Exceptional C++, ピアソン に細かく書いてあった気がする.