2010-06-01から1ヶ月間の記事一覧

だから concept が必要だったのに。

ところでこのソースコードを見てくれ。こいつをどう思う? http://ideone.com/3IjA2 #include <iostream> namespace A { // 適当な実装補助クラス class noncopyable { noncopyable( noncopyable const& ); void operator=( noncopyable const& ); protected: noncopya</iostream>…

句読点記号について

今まで何となく「、」「。」を使ってきたけど、 横書きで、かつ英単語などのアルファベットを多く書く場合には、 「,」「.」を使って書いた方が自然なのかもしれません。 というわけで,これからは「,」「.」も使っていこうと思います. 無論「、」「。…

std::complex の実部/虚部への参照を取得する

C++

例として、実部/虚部を別々にストリーム入出力させたいときとか。 それ reinterpret_cast で出来るよ! #include <complex> #include <cassert> #include <sstream> int main() { std::complex<double> z( 1, 1 ); double (&a)[2] = reinterpret_cast<double (&)[2]>(z); // well-formed assert( z.real() == a</double></double></sstream></cassert></complex>…

ファイルを BOOST_FOREACH で行ごとに処理したい

よーするに、こう書きたい。 BOOST_FOREACH( std::string line, lines( std::cin ) ) { // 入力の各行に対する処理 } std::getline を使ってループするのは美しくないですし。 多分 Boost 辺りを探せば有る…と思うんですが、見つからないです。 目撃情報求む…

C++ で Python の for を書きたい

Python の for 文って、 C++ のに比べて格好イイですよね。 # Python for i in range( 0, n ): # 0, 1, ... , n に対して処理する // C/C++ for( int i = 0; i < n; ++i ) { // 0, 1, ... , n に対して処理する } 単純に Python の方が短く書ける、というの…

std::tuple のメタ関数と get をちょっとだけ改良する

C++0x から新たに標準ライブラリに加わった「任意個の値の組」を扱うクラス std::tuple には、 std::tuple_size と std::tuple_element という二種類のメタ関数が用意されています: #include <tuple> #include <string> #include <type_traits> // std::is_same int main() { typedef st</type_traits></string></tuple>…

Boost.Optional は可能な限り trivial であるべきだ。

ちょっと前の記事で、 boost::optional のデストラクタは、 T のデストラクタが trivial であった場合でも 非 trivial になってしまうので、ちょっと嫌だなー、という旨を書きましたが、本の虫: C++0xにおけるPODの定義 を読んで、考え方が変わりました。 デ…

それでも Boost.Optional を使う、大きく分けて2つくらいの理由

Boost.Optional Must Go - 野良C++erの雑記帳 Boost.Optional Must Go (2) - 野良C++erの雑記帳 最近、何回かに分けて、 Boost.Optional について、(細かい)不満を日記に書いてきました。 これは別に Boost.Optional が嫌いだから不満を書いた訳ではな…

std::declval 関数テンプレート

C++0x では decltype によって「式の型」を得ることが出来ますが、 テンプレートメタプログラミングなんかで「ある型の変数を decltype 内で使いたい」って時には、 その変数をどうやって作るかが問題になります。 例えば T1 と T2 を乗算した結果の型が欲し…

Boost.Optional Must Go (2)

参考: C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳 http://ideone.com/PuFtN std::cout << boost::has_trivial_destructor< int >::value << std::endl; // true std::cout << boost::has_trivial_destructor< boost::optional<int> >::value <<</int>…

C++ で Maybe モナド

動機: C++ で Haskell の Either っぽい何かを作ってみた。 - 野良C++erの雑記帳 せっかく Either 作ったんだから Maybe モナドも作ろうぜ、という話。 まず Boost には、既に Maybe に相当する Boost.Optional が存在するので、 そいつをモナドの >>= に対…