
C++0x ではスレッドライブラリが標準提供されます。 スレッド関連のヘッダは , , の 3 つです。 基本的には Boost.Thread と同じように使えます。 (最近は Boost.Thread が C++0x に合わせて修正されているようです) #include <threads> struct do_work { void operator()() {} }; int main() { do_work dw; std::thread t(dw); t.join(); } #include <mutex> std::mutex m; struct hoge {} data; void process(const hoge&) {} void foo() { std::lock_guard<mutex> lk(m); process(data); } // unlock mutex
C++0x では、各コンテナに emplace/emplace_back/emplace_front/emplace_hint というメンバ関数が追加されます。 こういうクラスがあった場合 struct something { something(int, int, int); }; something をコンテナの要素として追加する場合、 C++03 では以下のようにしていました。 vector<something> v; v.push_back(something(1, 2, 3)); この方法では、 something のコンストラクタによる一時オブジェクトの生成と、コピーのコストが発生します。 Placement Insert では、可変引数テンプレートによって要素型のコンストラクタ引数を受け取ることで 要素をコンテナ内で一度だけ生成し、コピーのコストをなくします。 vector<
C++0x で追加される STL アルゴリズム ・find_if_not find_if の逆. pred(*i) == false のイテレータを返す template<class InputIterator, class Predicate> inline InputIterator find_if_not(InputIterator first, InputIterator last, Predicate pred) { while (first != last && pred(*first)) ++first; return first; } #include <vector> #include <algorithm> using namespace std; // 偶数? bool is_even(int value) { return value % 2 == 0; } int
マルチスレッドアプリケーションでは、スレッドごとに一意なデータを保持する必要が起きます。 これを、スレッドローカル記憶域と呼びます。 C++0x では、これを言語でサポートするため、 thread_local というキーワードが追加され thread_local を付けて宣言された変数は、スレッドごとに一度だけインスタンス化されます。 #include <threads> thread_local int j = 42; void foo() { j = 43; } int main() { std::thread t(foo); t.join(); if(j != 42) abort(); } 【スレッド変数のアドレス】 &演算子は、スレッド変数に使用された場合、現在のスレッドの変数のアドレスを返します。 なので、スレッド変数のアドレスは定数ではありません。 スレッドローカル記憶域は、ア
以下のように、戻り値の型を後ろに書けるようになる // now std::vector<double> foo(double); // new auto foo(double) -> std::vector<double>; 戻り値の型を後置すると、decltype でパラメータを計算した型を戻り値の型にできる template <class T, class U> auto foo(T t, U u) -> decltype(t * u) { return t * u; } いろいろ応用できそうな気がする N2541 New Function Declarator Syntax Wording C++0x言語拡張まとめ
関数テンプレートの、デフォルトテンプレート引数が使えるようになる template <class T, class U = double> void f(T t = 0, U u = 0); void g() { f(1, 'c'); // f<int,char>(1,'c') f(1) // f<int,double>(1,0) f(); // error: T cannot be deduced f<int>(); // f<int,double>(0,0) f<int,char>(); // f<int,char>(0,0) } DR226 Default template arguments for function templates C++0x言語拡張まとめ
コンパイラが生成する関数(コンストラクタ, コピーコンストラクタ, 代入演算子, デストラクタ etc...) のdefault/delete指定ができるようになる struct hoge { hoge() = default; // コンパイラが生成するデフォルトコンストラクタを使う }; インライン化の制御 struct hoge { virtual ~hoge(); }; hoge::~hoge() = default; // インライン化させない コピーの制御 struct hoge { hoge() = default; hoge(const hoge&) = delete; hoge& operator=(const hoge&) = delete; }; hoge h; // OK hoge h2(h); // エラー h = h2; // エラー new演算子の制御 str
C++0xでは、structやclassと同様に、enumも先行宣言できるようになります。 以下のようなヘッダーファイルがあった場合 // Color.h enum Color { /* 多くの列挙子... */ }; void draw(Color& color); draw関数の宣言にはColor内の列挙子を必要としませんが、 C++03ではenumを先行宣言することができないので Colorの列挙子を変更したら関連する全てのファイルの再コンパイルが必要になります。 C++0xでは、enumの先行宣言が許可されるので、 以下のように書くことができるようになります。 // Color.h enum Color : int; void draw(Color& color); // Color.cpp enum Color : int { /* 多くの列挙子... */ }; void dr
現在のenumはいろいろと問題がある ・型安全性 enum Color { ClrRed, ClrBlue, ClrYellow, ClrGreen, ClrBlack }; enum Alert { AltGreen, AltYello, AltRed }; bool is_danger(Alert alert) { return alert == ClrRed; // OK...他のenum値と比較できてしまう } ・スコープ enum Color { Red }; enum Alert { Red }; // エラー! 他にも、暗黙のキャストができてしまう等・・・ C++0xからは「enum class/enum struct」とすることで 上記の問題を解決した新しいenumを提供する enum class E { Val1, Val2, Val3 = 100, Val4/* = 1
可変長テンプレート引数 こんなことができるようになる template <class... Types> class tuple; tuple<> tup0; tuple<int, string> tup1(3, "abc"); tuple<int, string, double> tup2(3, "abc", 3.14); sizeof...演算子を使用すると型の数を取得できる template <class... Types> struct count { static const int value = sizeof...(Types); }; Variadic Templatesを使用するクラスはやはり再帰テンプレートを使って処理するようだ template <int Index, class... Types> struct tuple_impl; template <int I
C++0xになると、C++03でごちゃごちゃした部分がだいぶ すっきり書けるようになるので、C++0xでの入門はこんな感じになるよー、 という気持ちで書きました。 1. Hello World C++0xでの入出力には、IOStreamというものを使用します。 <<演算子でどんどんつないでいきます。 以下のプログラムの読み方は 「標準出力(cout)に"Hello World"という文字列と、改行(endl)を出力する」 です。 #include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; } Hello World coutとendlを使用するには、 #include <iostream> のように、という標準ライブラリのファイルを読み込む必要があります。 2. コメント 行コメント
【2015年12月24日記載 : C++11 ラムダ式の正式なまとめは、こちらのページ「C++11 ラムダ式 - cpprefjp C++日本語リファレンス」を参照してください】 今まではラムダ式のリビジョンが上がるたびに差分だけ書いてたので C++0xに採択されたラムダ式の解説をあらためて書きます。 【C++03までの問題点】 C++03では、関数をその場で作成する、ということができなかったため 関数を受け取るSTLアルゴリズムを使用する場合、以下のように、アルゴリズムに渡す用の関数を作成しなければなりませんでした。 struct is_even { typedef bool result_type; bool operator()(int x) const { return x % 2 == 0; } }; vector<int> v; find_if(v.begin(), v.end
コンテナや配列をループするための新たなfor文が追加されます。 いわゆるforeach文です。 今まで vector<int> v; for (vector<int>::iterator it = v.begin(), last = v.end(); it !=last; ++it) { cout << *it << endl; } これから vector<int> v; for (int value : v) { cout << value << endl; } 参照可 vector<int> v; for (int& value : v) { ++value; } 現在のC++でも、VC++8.0(VS2005)のfor eachや Boost C++ LibrariesのBOOST_FOREACHで同じように簡潔に書ける C++0x言語拡張まとめ
前回、std::moveを紹介したが、右辺値参照のためにはもう1つ std::forwardが用意される namespace std { template <class T> struct identity { typedef T type; }; template <class T> inline T&& forward(typename identity<T>::type&& x) { return x; } } まず、右辺値参照(&&)では、参照値(&)も受け取ることができる これがバグの温床になってしまうことがある struct hoge { hoge(int&) {} }; template <class T, class A> shared_ptr<T> factory(A&& a) { return shared_ptr<T>(new T(a)); } int main()
C++0xではにstd::moveという関数が追加される namespace std { template <class T> inline typename remove_reference<T>::type&& move(T&& x) { return x; } } これは、左辺値(もしくは右辺値)を右辺値に変換するための関数である class person { public: person() {} person(person&&) {} private: person(const person&); }; int main() { person p1; person p2 = std::move(p1); // OK...person(person&&); return 0; } Cry's Diary - 右辺値参照型と左辺値参照型 にあるように、名前が付いたオブジェクトは左辺値
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く