C++ まにあっく
や、マニアックでもなんでもないですが。
なるべくパクリ率を減らすべく努力いたします…。
Boost を使おう
Boost のない C++ はただの C with classes だ --ゲーテ
素のC++は (STLでいくらか改善されるとはいえ) プログラミング言語としては中途半端。きっとBoostを使えばあなたもそう思ってくれる! (-)b ただし、素のC++に戻れない可能性もあるのでご注意を:
Boost 公式サイト http://www.boost.org/
日本語の分かりやすい解説: Let's Boost
オススメは...
smart_ptr スマートポインタ。このためだけにもBoostを使おう。(TR1 にも含まれるらしいですが) 重要なのは二つ:
- shared_ptr
- 参照カウントつきのポインタ
- scoped_ptr
- delete を自動でするだけ。std::auto_ptr と違って余計なことが出来ないので安全…かもしれない。
bind と function クロージャー。Boost 使うならこれも使わなきゃ!
- Python 的に書けば、
1 class Hoge { 2 public: 3 void func(int i) { 4 std::cout << i << std::endl; 5 } 6 }; 7 Hoge hoge; 8 boost::function<void ()> f = boost::bind(&Hoge::func, &hoge, 10); 9 f(); // これで 10 が表示される!
Ruby だとこうなるのかな? あまり Ruby 的ではないんでしょうけど。1 class Hoge: 2 def func(self, i): 3 print i 4 hoge = Hoge() 5 f = lambda: hoge.func(10) 6 f()
class Hoge def func(i) p i end end hoge = Hoge.new f = proc {hoge.func(10)} f.callC++0x ではネイティブサポートされるみたいですね。とか出来るのかしら?1 auto f = <&> () (hoge.func(10)); 2 f();
any 任意の型を格納できる変数!
1 boost::any v = 10; 2 std::cout << boost::any_cast<int>(v) << std::endl; 3 v = std::string("hoge"); 4 std::cout << boost::any_cast<std::string>(v) << std::endl;
tuple 複数変数同時代入だ!
1 int i; 2 std::string s; 3 boost::tie(i, s) = boost::make_tuple(10, "hoge");
assign とりあえず、↓だけでも十分便利かと。
- こちらも C++0x ではネイティブサポートらしく、
1 std::vector<int> v = boost::assign::list_of(10)(20)(30);とかけるらしい。1 std::vector<int> v = {10, 20, 30};
regex 正規表現が使えない言語が許されるのは、中学生までだよねー。
正直、これだけ使えれば、C++ライフを劇的にかえるには十分かと。
ADL
ADL (Argument Dependent name Lookup) ってえのがあります。要は
1 std::cout << "hoge" << std::endl;
なんて書いたときに、operator << は勝手に std::operator << が使われますよね。このように、引数が std 名前空間に入っていれば、関数 (や演算子) も std から探してくれるってやつです。
これだけだと「ちょっとした便利機能」以外の何者でもないんですが、特にテンプレートあたりで複雑なワークアラウンドをしてると思わず躓いてしまうことがあります。(Boost の Serialization あたりで問題が起きたことがある気がする…) 無意識にADLを前提としたプログラムを組んでいたら、実は無効になっていた! という場合です。というわけで、こちら
typedef や using をはさむとADLが無効になりますよ、というだけなんですけどね。
一時オブジェクトを参照で
こんなんできます。
1 Hoge func();
2 const Hoge& hoge = func();
お姉さんびっくりだ! func() の戻り値の一時オブジェクトは hoge のスコープが切れるまで生き続けます。
ソースはこちら
