C++0x
http://d.hatena.ne.jp/gintenlabo/20110220/1298187803の解答と解説です。
追記: 問題を追加して整理しました。 コメントにあった auto && に関しては、また後ほど触れたいと思います。 問 C++0x において、以下のコード int f(); int& g(); int&& h(); int main() { auto x0 = 0; int i = 1; auto x1 = i; int const j = 2; auto x…
C++0x において、関数の戻り値に、関数内部のローカル変数を「そのまま」帰す場合を考えます: std::string f() { std::string s = "hoge"; return s; } この場合、戻り値として使われるローカル変数 s は、自動的に move されます。 つまり、以下のコードは…
cpprefjp の std::pair の項目を下書きしてて気がついたんですが、 いつの間にか std::pair の Range Access が規格から消えていました: std::multimap<int, std::string> m = { { 0, "hoge" }, { 1, "fuga" }, { 1, "piyo" }, { 2, "foo" }, }; // equal_range のような イテ</int,>…
ラムダ式ネタをもう一つ。こっちは少々マニアックな内容です。 C++0x におけるラムダ式は、 int f( std::vector<int> const& v1, std::vector<int> const& v2 ) { int sum = 0; auto add_to_sum = [&](int x){ sum += x; }; std::for_each( v1.begin(), v1.end(), add_</int></int>…
C++0x から新たに C++ に追加された要素に、ラムダ式というものがあります。 これは、ちょっとした関数を、その場で定義して使えるようにしたもので、 #include <vector> #include <numeric> #include <iostream> int main() { std::vector<double> v = { -1, 2, 1.5, -4 }; double prod = std::</double></iostream></numeric></vector>…
該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move_if_noexcept C++0x 標準ライブラリ完全解説の三回目です。 今回は解説することも少ないので、さっさと書いてしまうことにします。 …
該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move 少し間隔があいてしまいましたが、 C++0x 標準ライブラリ完全解説の二回目です。前回の記事では、 C++98/03 の時点から変わらない…
http://d.hatena.ne.jp/gintenlabo/20110108/1294485577#c で、 #include <utility> template<class F, F f> class il_ptr_fun; template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R operator()( Args... args ) const { return (*pf)( std::forward</r></class></class></utility>
お題 http://d.hatena.ne.jp/Cryolite/01000831#p1 を C++0x によって実現してみる。 解答1 Variadic Templates を使う。 #include <utility> template<class F, F f> class il_ptr_fun; // とりあえず関数ポインタだけ template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R ope</r></class></class></utility>…
No.00 Introduction (2011-01-07 更新) No.01 namespace rel_ops, utility (2011-01-07 更新) No.02 std::move, utiliy (2011-01-16 更新) No.03 std::move_if_noexcept, utiliy (2011-01-17 更新) No.04 std::swap, utiliy (次回予定)
該当規格: 20.3.1 Operators [operators], N3225 http://sites.google.com/site/cpprefjp/reference/utility/rel_ops さて、それでは早速、具体的なライブラリに移っていこうと思います。 とはいえ、初回から飛ばすのもアレなので、まずは軽いものを、 とい…
はじめに 現在 FDIS 制定に向けて着々と作業が進められてる C++ の次世代規格、通称 C++0x では、 今までの C++ で使いにくかった部分を、より便利に扱えるよう、様々な改良が行われています。 この改良は、言語コア部分の改良のみにとどまるものでは当然 な…
前回の記事で説明したように、 auto p = std::make_shared<hoge>(); のような、「関数(あるいはコンストラクタ)の戻り値を変数に束縛する」コードは、*1 one-phase construction ではありません。 これはつまり、 struct person : private boost::noncopyable //</hoge>…
導入 皆さんは C++ と聞いて、まず何を思い浮かべますか? 「C++? そんなの過去の遺物だろ? GC ないとか原始的すぎるじゃん?」 って思う人もいれば、 「いや、 C++ って無闇に複雑すぎて使えない。正直 C 言語で十分でしょ」 って人もいるでしょう。 が、…
少し前に書いた記事 で紹介した std::unique_ptr の C++98/03 移植が Boost にないのはなんでなんだぜ、 と思っていたら、実は既にあったようなので、ここで紹介します。 Boost.Interprocess.UniquePtr Boost.Interprocess なんていう仰々しいライブラリに入…
本の虫: post-Batavia mailiingの簡易レビュー C++0x の最新ドラフトが N3225 になったようです。 今回のドラフトにおける主な変更点ですが、 ユーザ定義のデストラクタ、ムーブ、コピーが存在する場合 暗黙のムーブは生成されない 暗黙のコピーは deprecate…
Etude C++ Libraries: http://github.com/gintenlabo/etude 時代は C++0x ですよ奥さん。 // まだマトモに使えるものが存在しないけどな! // っていうかもう一つの俺々ライブラリは絶賛放置中だけどな!
C++0xに素晴らしい変更が来たようです: 本の虫: C++0xにすごい変更が来た この変更により、初心者にありがちな間違いである、 class my_string { char* buf; public: my_string( char const* s ) { std::size_t const n = std::strlen(s); buf = new char[n…
C++0x の で定義されている std::all_of 辺りが使いたかったので、 その辺を適当に実装したヘッダを作ってみました:http://gist.github.com/664418 実装した関数は以下の通りです: all_of any_of none_of find_if_not is_permutation copy_n copy_if is_pa…
C++ において、データのアライメントというのは極めて大事な概念です。*1 しかし、今までの C++ の規格では、その辺りのコードに必要な情報を得るための方法が少なく、 移植性を意識したコードを書こうと思ったら、 Boost 辺りに頼らなければいけませんでし…
C++0x の の話。 基本的なこととかは 本の虫: C++0xの新しい乱数ライブラリ、random を参照してください。 さて、上記の記事で登場している std::seed_seq ですが、 N3126 の 26.5.7.1 Class seed_seq によると、このクラスは内部に std::vector を保持して…
お題 当面のスコープガード - Faith and Brave - C++で遊ぼう のスコープガードを std::unique_ptr を使って実装してみる。 std::unique_ptr を使うことで、 release() によるキャンセルが可能になるし、 メモリ確保の回避や静的解析による最適化で、パフォ…
結論から先に言いましょう。 C++0x では、 explicit operator bool を定義すれば、自動的に ! 演算子も使えるようになります: // getchar の戻り値とかで使えそうな何か struct hoge { hoge() : ch_(-1) {} hoge( char ch ) : ch( static_cast<unsigned char>(ch) ) {} exp</unsigned>…
C++98 では「参照への参照」は作ってはいけないことになっていました: typedef int& ref_t; ref_t& ref = 〜; // 駄目。参照の参照は無理。 これは、基本的には、思わぬミスを防げるので 良い仕様と言えるのですが、 テンプレートを使うときに、思わぬコン…
Boost.Flyweight の発表するときの資料として規格を見ていた時に気づいたんですが、 C++0x の Working Draft (N3126) の 20.8.15 Class template hash の項目の、 template <> struct hash<T*>;の部分がおかしいです。 正しくは、 template <class T> struct hash<T*>;となっ</t*></class></t*>…
C++0x の std::vector には、新しく shrink_to_fit() メンバ関数が用意されています。 これは「 vector の確保しているメモリ領域を、その大きさに見合ったサイズまで縮小する」関数で、 典型的な使い方は、以下のような感じになります: // std::vector に…
代わりに std::unique_ptr (あるいは boost::scoped_ptr )を使います. 何故か? struct hoge { hoge() : xxx( get_resource() ) { /* 処理 */ if( some_cond ) throw some_exception(); /* さらに処理 */ } ~hoge() throw(){ release_resource(xxx); } /*…
驚くべきことに,世の C++er の中には,未だに 「自前のクラスを作る場合は,忘れずに代入演算子を定義し,自己代入チェックをしなければいけない」 という考えを持った人がいるようです. http://d.hatena.ne.jp/nagoya313/20100706/1278428503 確かに,昔…
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>…