2008/09/20 たまにはまじめにC++0x たまにはまじめにC++0x 長月 葵.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Item 1:View C++ as a federation of languages. C++ はただの ”C のクラスがあるバージョン ” ではない → 例外安全 (29 項 ) 、テンプレート (41 項 ) 、オーバーロード等の導入によりデザインや目指すコードが 変化している プログラミング言語はあくまで言語.
C++ 基礎. 目次 C++ とは? C++ におけるオブジェクト指向 課題 C++ とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++ では大規模なプログラミングの.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Generic programming と STL
高橋 晶(アキラ) Blog: Faith and Brave – C++で遊ぼう
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Javaのための暗黙的に型定義される構造体
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
C言語講座 第4回 ポインタ.
構造体.
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミングII 第 7 回 オブジェクトの配列 New, delete 参照 田向.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
C++0x コンセプト 高橋晶(アキラ) ブログ:「Faith and Brave – C++で遊ぼう」
情報工学演習I 第12回 C++の演習4(インライン展開).
暗黙的に型付けされる構造体の Java言語への導入
プログラミング応用 printfと変数.
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
情報処理Ⅱ 第2回:2003年10月14日(火).
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
Boostのスマートなポインタを使ってみる
ポインタとポインタを用いた関数定義.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
情報処理Ⅱ 第7回 2004年11月16日(火).
情報処理Ⅱ 2005年10月28日(金).
メンバとメソッド C言語の構造体 変数の集まり C#言語のクラス + それを処理する関数の集まり フィールド または メンバ変数 メンバ
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
プログラミング 4 文字列.
フレンド関数とフレンド演算子.
演算子のオーバーロード.
PROGRAMMING IN HASKELL
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
情報処理Ⅱ 第8回:2003年12月9日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

2008/09/20 たまにはまじめにC++0x たまにはまじめにC++0x 長月 葵

自己紹介 名前 身長体重 3サイズ 職業 趣味 概要 長月葵 (あおいたん、特濃師匠) 身長182cm、体重64kg 2008/09/20 自己紹介 名前 長月葵 (あおいたん、特濃師匠) 身長体重 身長182cm、体重64kg 3サイズ B 91cm、W 70cm、H 88cm 職業 組み込み系プログラマ 趣味 お絵かき、囲碁、変な言語 概要 変な言語紹介がわんくまでのお仕事 その流れでC++0xを紹介することに

今日の予定 今日は趣味の厳選したネタを 時間がある限り コンセプト コンセプトマップ 公理 正規表現 疑似乱数フレームワーク 2008/09/20 今日の予定 今日は趣味の厳選したネタを コンセプト コンセプトマップ 公理 正規表現 疑似乱数フレームワーク 時間がある限り こんな機能が追加されます こんなライブラリが追加されます こんな構文規則が変更されます

コンセプト テンプレートには暗黙のお約束がある お約束の明示 コンパイルエラーが読みやすくなるよ ポリシークラスなんかが良い例 2008/09/20 コンセプト テンプレートには暗黙のお約束がある ポリシークラスなんかが良い例 暗黙的に (定義/実装を見ないとわからない形で) 何らかのインターフェ イスを要求する お約束の明示 コンセプトは要求するインターフェイスを明示する 継承関係ではなくインターフェイス指向の多態性を目立たせる (所謂ダ ックタイプ) コンパイルエラーが読みやすくなるよ これまでのC++コンパイラでは要求されるインターフェイスを満たしてい ないときに呼び出し側のエラーとされるためエラーメッセージが直感的 ではなかったが、必要なインターフェイスが明示されるのでインターフェ イス要件を満たしていないことをエラーメッセージに出すことが出来る

コンセプト引数が一つの場合に使える省略記法 コンセプト引数が一つの時にしか使えないのが玉に瑕 でも限定されてる感があって個人的には好み 2008/09/20 コンセプトの使い方1 コンセプト引数が一つの場合に使える省略記法 コンセプト引数が一つの時にしか使えないのが玉に瑕 でも限定されてる感があって個人的には好み template<OneArgConcept T> const T& min(const T &x, const T &y) { return x < y ? x : y; }

コンセプトの使い方2 一般的記法 C#のwhere句なんかと似た構文なのでわかる人にはわかりやすい 2008/09/20 コンセプトの使い方2 一般的記法 C#のwhere句なんかと似た構文なのでわかる人にはわかりやすい template<typename T> require OneArgConcept<T> const T& min(const T &x, const T &y) { return x < y ? x : y; }

コンセプトの書き方1 コンセプト引数を一つ取ってみる これなら省略記法が使える 2008/09/20 コンセプトの書き方1 コンセプト引数を一つ取ってみる これなら省略記法が使える auto concept OneArgConcept<typename T> { bool operator<(T, T); }

コンセプトの書き方2 コンセプト引数を二つ取ってみる 使うときには一般的使用法を使用する 2008/09/20 コンセプトの書き方2 コンセプト引数を二つ取ってみる 使うときには一般的使用法を使用する auto concept TwoArgsConcept<typename T, typename U> { operator U(const T&); }

コンセプトの書き方3 他のコンセプトを包含する コンセプトの要件として他のコンセプトを含むことが出来る 2008/09/20 コンセプトの書き方3 他のコンセプトを包含する コンセプトの要件として他のコンセプトを含むことが出来る concept ConceptHolder<typename T, typename U> { require ContainedConcept<T>; U operator*(const T&); T& operator++(T&); T operator++(T&, int); }

コンセプトの書き方4 コンセプトの継承 コンセプトも継承できる 多態するわけではないので差分プログラミング以上の効能があるのか いまいち不明 2008/09/20 コンセプトの書き方4 コンセプトの継承 コンセプトも継承できる 多態するわけではないので差分プログラミング以上の効能があるのか いまいち不明 concept DerivedConcept<typename T, typename U> : BaseConcept<T, U> { // 追加の要件 }

コンセプトの書き方5 型名の要求 コンセプトに型名の要求を含むことが出来る 2008/09/20 コンセプトの書き方5 型名の要求 コンセプトに型名の要求を含むことが出来る STLでは抽象化された型名を内部で沢山使っているのでコンセプトベー スに書き直す時に活躍しそうな機能 concept TypeConcept<typename T> { typename reference; reference operator*(const T&); // 参照外し }

コンセプトの書き方6 late_check late_checkで囲った部分ではコンセプトのチェックが抑制される 2008/09/20 concept Semigroup<typename T> { T::T(const T&); T operator+(T, T); } concept_map Semigroup<int> { int operator+(int lhs, int rhs) { return x + y }; template <Semigroup T> T add(T lhs, T rhs) { x + y; // Semigroup<T>::operator+でのコンセプトチェック late_check { x + y; // class Tのoperator+でのチェック via. Faith and Brave - C++で遊ぼう

コンセプトマップ コンセプトを満たす型を明示する autoがここにも コンセプトマップのテンプレート 2008/09/20 コンセプトマップ コンセプトを満たす型を明示する コンセプトマップは型がどのようにコンセプトにマッチするかを明示する コンセプトマップを定義出来る限りにおいて型の定義を変更することなく 型をコンセプトにマッチすることが出来る autoがここにも コンセプトの定義にautoがついている場合コンセプトの要求するインタ ーフェイスを持っている型すべてがコンセプトを満たすことになる autoをつけない場合コンセプトを満たす型を宣言するのにコンセプトマ ップを使う必要がある コンセプトマップのテンプレート コンセプトマップもテンプレート化出来る

コンセプトマップの書き方1 プリミティブな型で書いてみる 2008/09/20 コンセプトマップの書き方1 プリミティブな型で書いてみる intはそのままではTypeConceptを満たせないのでコンセプトマップによ って満たせるように定義する concept_map TypeConcept<int> { typedef int& reference; };

コンセプトマップの書き方2 テンプレートにしてみる なんでもコンセプトを満たせるようにする。あれ? 2008/09/20 コンセプトマップの書き方2 テンプレートにしてみる なんでもコンセプトを満たせるようにする。あれ? template<typename T> concept_map TypeConcept<T> { typedef T& reference; };

公理 コンセプトの意味を定義する concept Number<typename T> { // ... axiom { 2008/09/20 公理 コンセプトの意味を定義する concept Number<typename T> { // ... axiom { Var<N> a, b; a+0 == a; 0+a == a; a+b == b+a; } via.Faith and Brave - C++と遊ぼう

正規表現 新ヘッダ<regex> 正規表現を表すクラス 結果を表すクラス 実行関数 とってもそのままの名前のヘッダが追加される 2008/09/20 正規表現 新ヘッダ<regex> とってもそのままの名前のヘッダが追加される 正規表現を表すクラス 正規表現を表すクラスbasic_regexが追加される 後述する実行関数で平文に対して適用する正規表現オブジェク トを生成する 結果を表すクラス 結果を返すクラスmatch_resultsが追加される 後述する実行関数で正規表現の評価結果が格納されるオブジ ェクトを生成する 実行関数 検索regec_search 置換regex_replace 正規表現と文字列をとり、結果をmatch_resultsに返す

正規表現の使い方 #include <iostream> #include <regex> 2008/09/20 正規表現の使い方 #include <iostream> #include <regex> using namespace std; int main() { string str = "The HTML tag <title> means that ..."; // <で始まって>で終わる文字列にマッチする正規表現で検索 regex reg( "<[^>]+>" ); smatch result; if (regex_search(str, result, reg)) { cout << "found (pos=" << result.position() << ")" << endl; cout << " ==> " << result.str() << endl; } return 0; via.Faith and Brave - C++と遊ぼう

ついでにboost::regexと比べてみる 2008/09/20 ついでにboost::regexと比べてみる #include <iostream> #include <string> #include <boost/regex.hpp> using namespace std; int main() { // <で始まって>で終わる文字列にマッチする正規表現で検索 boost::regex r( "<[^>]+>" ); boost::smatch m; string str1 = "The HTML tag <title> means that ..."; if( boost::regex_search(str1, m, r) ) cout << "found (pos=" << m.position() << ")" << endl; cout << " ==> " << m.str() << endl; } return 0; via.Let's Boost

2008/09/20 こんな機能が追加されます こんな機能が追加されます

右辺値参照 (とMove semantics) 2008/09/20 こんな機能が追加されます 右辺値参照 (とMove semantics) これまでconst &でしか受け取れなかった右辺値を右辺値参照 と呼ばれる参照型で受け取れるようになる これにより左辺値参照と区別がつくのでMove semanticsを実現 出来るようになる constexpr 式を定数式としてコンパイル時解決であることをコンパイラに指 定する ユーザ定義型の定数化についてはいろいろお作法があってめ んどくさい 外部テンプレート テンプレートの実体化を抑制する 外部の名の通りexternで宣言する

こんな機能が追加されます 型推論 範囲for ラムダ式 autoが型推論のキーワードに変更される 2008/09/20 こんな機能が追加されます 型推論 autoが型推論のキーワードに変更される sizeofの要領で型を返す演算子decl_typeが追加 範囲for 範囲コンセプトを満たす型について簡易表記のfor文が使えるよ うになる for(int& t: range_based_container) something(); ラムダ式 無名関数構文 記法が気持ち悪い。要慣れ [](int x, int y) -> int { return x + y; } // えー(´д`;)

こんな機能が追加されます 新しい関数構文 コンセプト 委譲コンストラクタ nullptr 新しい関数宣言の構文 記法が気持ち悪い。要慣れ 2008/09/20 こんな機能が追加されます 新しい関数構文 新しい関数宣言の構文 記法が気持ち悪い。要慣れ []FuncName(int x, int y) -> int; // えー(´д`;) コンセプト おなかいっぱい 委譲コンストラクタ コンストラクタからコンストラクタが呼べるようになる おかげで同じ処理を何度もうきー! が減ります nullptr ついに導入される事に これでヌルポインタによる関数オーバーロードの誤爆がなくなる はず

こんな機能が追加されます 強い型付けのenum テンプレートの別名付け 可変長引数テンプレート 2008/09/20 こんな機能が追加されます 強い型付けのenum 結局の所単なる整数値だった列挙体がちゃんと型として扱われ る様に宣言出来るようになる 今まで通りの書き方だと今まで通りのenum enum classと宣言する通り特殊なクラスとして扱われる テンプレートの別名付け 一部の型指定のみでも別名付けできるようになる 可変長引数テンプレート テンプレート引数が可変個とれる やっぱりここでも...演算子

こんな機能が追加されます Unicode文字列リテラル ユーザ定義リテラル スレッドローカル記憶域 2008/09/20 こんな機能が追加されます Unicode文字列リテラル UTF-8、UTF-16、UTF-32がサポートされる 伴ってchar16_tとchar32_tが追加される それぞれプリフィックスはu8、u、U。UTF-8だけ二文字 ユーザ定義リテラル リテラルの文字の並び自体を取るrawリテラルと文字の並びを解 釈した結果の値としてのcookedリテラルの二段階に解釈される 様になる 出力型 operator"接尾語文字列"(引数)と言った形で定義する 引数にconst char*を取るとrawリテラルを処理出来る。 スレッドローカル記憶域 新しい記憶クラス域指定子thread_localが追加されスレッドロー カルなグローバル変数や静的変数が宣言できるようになる

こんな機能が追加されます default指定とdelete指定 long long int 静的アサート 2008/09/20 こんな機能が追加されます default指定とdelete指定 default指定をすることによってデフォルトコンストラクタを明示できる delete指定をすることによってコンパイラによる特殊関数の自動生成を 抑制出来る 今までprivateなコピーコンストラクタと代入演算子でごまかしていた 代入不可能性をdelete指定で自然に表現できる long long int お待ちかねの、と言うか割合今更な64bit整数 静的アサート コンパイル時に定数式を評価して偽である場合にコンパイルエラーとす るキーワードstatic_asertが追加される

2008/09/20 こんな構文規則が変更されます こんな構文規則が変更されます

テンプレート引数リストのアングルブラケット 2008/09/20 こんな機能が追加されます POD型の定義の修正 説明がめんどくさい感じなのでWikipedia辺りを参照のこと 初期化リスト 配列やPOD型の初期化の構文を一般的な型にも適用可能に拡張する 伴ってstd::initializer_list<typename T>が追加される テンプレート引数リストのアングルブラケット hoge<piyo<fuga>>が書ける hoge func(hoge<piyo>= default_value);も書ける 変換関数にも有効なexplicit 今まで変換演算子には何も効果がなかったexplicitが変換演算子でも 有効になる

インスタンス化されていないクラスメンバへのsizeof 2008/09/20 こんな構文規則が変更されます 制限のない共用体 参照型以外はなんでもメンバに出来るようになる インスタンス化されていないクラスメンバへのsizeof 静的でないインスタンス化されていないクラスのメンバのsizeof が取得できるように変更される

2008/09/20 こんなライブラリが追加されます こんなライブラリが追加されます

こんなライブラリが追加されます スレッド タプル ハッシュを使ったmapとset 日本語で取り上げてるところが端的すぎて困る 2008/09/20 こんなライブラリが追加されます スレッド 日本語で取り上げてるところが端的すぎて困る とりあえずBoost::threadと大体同じ threadオブジェクトのコンストラクタにスレッドのエントリポイント になる関数オブジェクトを放り込んでやればとりあえず使える タプル 可変個引数テンプレートを活かして任意個の型のタプルが使用 できるように std::pairでは物足りなかったあなたに ハッシュを使ったmapとset hash_map/hash_setかと思いきや unorderd_map/unorderd_set STLPortを始め主要なSTL実装系には大体入っていた物なので 案外おなじみ

こんなライブラリが追加されます 正規表現 スマートポインタ 疑似乱数フレームワーク Perlerでもある長月にはおいしい代物。詳しくは本文で 2008/09/20 こんなライブラリが追加されます 正規表現 Perlerでもある長月にはおいしい代物。詳しくは本文で スマートポインタ もう自分で作らなくて良いんだ! もうBoost落としてこなくてもいい んだ! と言うわけでshared_ptrとweak_ptrとunique_ptrが追加 unique_ptrはauto_ptrの代用品。ポインタの移動がMove semanticsで実装されるそうな 疑似乱数フレームワーク 乱数エンジンと乱数分布の組み合わせで使う とりあえずエンジンは線形合同法とキャリー付き減算とメルセンヌツ イスタがついてくる

こんなライブラリが追加されます 参照ラッパ 多態的関数オブジェクトラッパ 型特性 result_of 参照のように振る舞うテンプレート型 2008/09/20 こんなライブラリが追加されます 参照ラッパ 参照のように振る舞うテンプレート型 多態的関数オブジェクトラッパ 関数ポインタのようなオブジェクト 引数の型が交換可能であれば必ずしも一致していなくてもよいなど 関数ポインタよりは融通が利く 型特性 型の情報を取得する is_なんとかが沢山ある。メタプログラミング用らしい result_of 関数の戻り値の型を取得する これもまたメタプログラミング用

こんなライブラリが追加されます 固定長配列 メンバ関数アダプタ 汎用関数オブジェクト 日付/時間ライブラリ オブジェクト化された配列 2008/09/20 こんなライブラリが追加されます 固定長配列 オブジェクト化された配列 begin()/end()によるイテレータの取得などができる メンバ関数アダプタ 汎用的に使えるmem_funの様なオブジェクト 汎用関数オブジェクト 関数ポインタメンバ関数ポインタ、ファンクタを同じように扱える コールバッククラスという名前で実装記事をよく見かけたアレ 日付/時間ライブラリ chronoって名前がなんかかっこいい 経過時間、時点、時刻を扱うライブラリ。関連して有理数クラスな んかも使う

こんなライブラリが追加されます 単方向リスト 2008/09/20 こんなライブラリが追加されます 単方向リスト std::listは双方向リストなので時間的にも空間的にもオーバーヘッド があるので単方向リストを追加

実装が環境依存になるライブラリがあったり 言語機能にてこ入れがあったり歴史的にす ごい変化 2008/09/20 まとめ 追加機能多すぎ いろいろ簡単にはなっている 実装が環境依存になるライブラリがあったり 言語機能にてこ入れがあったり歴史的にす ごい変化 でもありがたみはわかりにくい わかる人はたぶん上級者 それでもやっぱりC++が好き