津田 義史 翻訳
津田 義史 原著
ダビード・ヴァンデヴォールデ 著
ニコライ・M・ジョスティス 著
本書は、C++テンプレートの使い方について、包括的かつ正確な情報を提供する本格的な書籍です。チュートリアルだけでなく、完全なリファレンスをも含んでおり、多くのサンプルコードを載せています。また、テンプレートの最も強力な機能は、単に使われていないか、あるいは誤解され、間違って使われることが非常に多くなっています。そこでソフトウェアアーキテクトとエンジニアのみなさんに、テンプレートをなぜ、いつ、どのように使うのかを示し、クリーンで高速かつ賢いソフトウェアをより効率的に構築し保守するための知識とノウハウを提供しています。すべてのC++プログラマには必須の1冊となります。
第1章 この本について
1.1 本書を読む前に知っておくべきこと
1.2 本書全体の構成
1.3 本書の読み方
1.4 プログラミングスタイルについて
1.5 標準と現実
1.6 サンプルコードと追加情報
1.7 ご感想をお寄せ下さい
● 第1部 基本
第2章 関数テンプレート
2.1 初めて見る関数テンプレート
2.1.1 テンプレートを定義する
2.1.2 テンプレートを使う
2.2 引数の推論
2.3 テンプレートパラメータ
2.4 関数テンプレートの多重定義
2.5 まとめ
第3章 クラステンプレート
3.1 Stackクラステンプレートの実装
3.1.1 クラステンプレートの宣言
3.1.2 メンバ関数の実装
3.2 Stackクラステンプレートの使用
3.3 クラステンプレートの特殊化
3.4 部分的な特殊化
3.5 デフォルトのテンプレート引数
3.6 まとめ
第4章 インタイプテンプレートパラメータ
4.1 クラステンプレートのノンタイプパラメータ
4.2 関数テンプレートのノンタイプパラメータ
4.3 ノンタイプテンプレートパラメータの制限
4.4 まとめ
第5章 技巧の基本
5.1 typenameキーワード
5.2 this->を使う
5.3 メンバテンプレート
5.4 テンプレートテンプレートパラメータ
5.5 ゼロで初期化
5.6 関数テンプレートの引数に文字列リテラルを使う
5.7 まとめ
第6章 テンプレートの実践的な使い方
6.1 包含モデル
6.1.1 リンカエラー
6.1.2 ヘッダファイル中のテンプレート
6.2 明示的なインスタンス化
6.2.1 明示的なインスタンス化の例
6.2.2 包含モデルと明示的なインスタンス化の組み合わせ
6.3 分割モデル
6.3.1 exportキーワード
6.3.2 分割モデルの制限
6.3.3 分割モデルの準備
6.4 テンプレートとinline
6.5 プリコンパイル済みヘッダ
6.6 テンプレートのディバック
6.6.1 エラー長編小説の解読
6.6.2 浅いインスタンス化
6.6.3 長いシンボル
6.6.4 トレーサ
6.6.5 オラクル
6.6.6 アーキタイプ(Archetypes:原型)
6.7 補遺
6.8 まとめ
第7章 基本的なテンプレートの用語
7.1 「クラステンプレート」か「テンプレートクラス」か?
7.2 インスタンス化と特殊化
7.3 宣言と定義
7.4 ODR(One-Definition Rule)
7.5 テンプレート引数とテンプレートパラメータ
● 第2部 テンプレートの深層
第8章 基本法則の深層
8.1 宣言パラメータ化
8.1.1 仮想メンバ関数
8.1.2 テンプレートのリンゲージ
8.1.3 プライマリテンプレート
8.2 テンプレートパラメータ
8.2.1 型パラメータ
8.2.2 ノンタイプパラメータ
8.2.3 テンプレートテンプレートパラメータ
8.2.4 デフォルトのテンプレート引数
8.3 テンプレート引数
8.3.1 関数テンプレートの引数
8.3.2 型引数(Type Arguments)
8.3.3 ノンタイプ引数
8.3.4 テンプレートテンプレート引数
8.3.5 等価性(Equivalence)
8.4 フレンド
8.4.1 フレンド関数
8.4.2 フレンドテンプレート
8.5 補遺
第9章 テンプレートに含まれる名前
9.1 名前の分類
9.2 名前の検索
9.2.1 引数依存検索(ADL:Argument-Dependent Lookup)
9.2.2 フレンド名のインジェクション
9.2.3 インジェクションされたクラス名
9.3 テンプレートのディバック構文解析
9.3.1 非テンプレートの文脈依存性
9.3.2 型の依存名
9.3.3 テンプレートの依存名(context Sensitivity)
9.3.4 using宣言中の依存名
9.3.5 ADLと明示的なテンプレート引数
9.4 派生とクラステンプレート
9.4.1 非依存のベースクラス
9.4.2 依存のベースクラス
9.5 補遺
第10章 インスタンス化
10.1 オンデマンドのインスタンス化(On-Demand Instantiation)
10.2 インスタンス化の遅延(lazy Instantiation)
10.3 C++のインスタンスモデル
10.3.1 2段階検索(Two-Phase Lookup)
10.3.2 インスタンス化する場所(POI:Point of Instantiation)
10.3.3 包含モデルと分割モデル
10.3.4 翻訳単位をまたいだ検索
10.3.5 例
10.4 実装スキーム
10.4.1 貧欲なインスタンス化(Greedy Instantiation)
10.4.2 問い合わせ型インスタンス化(Queried Instantiation)
10.4.3 反復的なインスタンス化(Iterated Instantiation)
10.5 明示的なインスタンス化
10.6 補遺
第11章 テンプレート引数の推論
11.1 推論プロセス
11.2 文脈の推論
11.3 推論の特別な状況(Special Deduction Situations)
11.4 許容できる引数変換
11.5 クラステンプレートパラメータ
11.6 デフォルトの呼び出し引数
11.7 Barton-Nackmanのトリック
11.8 補遺
第12章 特殊化と多重定義
12.1 「ジェネリックなコード」では役に立たないとき
12.1.1 透過的なカスタマイズ
12.1.2 意味の透過性
12.2 関数テンプレートの多重定義
12.2.1 シグネチャ
12.2.2 多重定義された関数テンプレートの、完全な順序付け
12.2.3 正式な順序付けルール
12.2.4 テンプレートと非テンプレート
12.3 明示的な特殊化
12.3.1 クラステンプレートの完全な特殊化
12.3.2 関数テンプレートの完全な特殊化
12.3.3 メンバの完全な特殊化
12.4 クラステンプレートの部分的な特殊化
12.5 補遺
第13章 将来の動向
13.1 角括弧のハック
13.2 typenameの緩いルール
13.3 デフォルト関数のテンプレート引数
13.4 文字列リテラルと浮動小数点のテンプレート引数
13.5 テンプレートテンプレートパラメータの緩いマッチング
13.6 typedefテンプレート
13.7 関数テンプレートの部分的な特殊化
13.8 typeof演算子
13.9 名前付きテンプレート引数
13.10 静的なプロパティ(static properties)
13.11 インスタンス化時のコンパイルエラー
13.12 クラステンプレートの多重定義
13.13 リストパラメータ
13.14 レイアウトのコントロール
13.15 初期化子の推論
13.16 関数式
13.17 補遺
● 第3部 テンプレートと設計
第14章 テンプレートが多態する能力
14.1 動的な多態
14.2 静的な多態
14.3 「動的な多態」対「静的な多態」
14.4 デザインパターンの新しい形
14.5 ジェネリックプログラミング
14.6 補遺
第15章 トレイツとポリシークラス
15.1 例:列を積算する
15.1.1 固定されたトレイツ
15.1.2 値トレイツ
15.1.3 パラメータ化したトレイツ
15.1.4 ポリシーとポリシークラス
15.1.5 トレイツとポリシーの違いは何か?
15.1.6 「メンバテンプレート」対「テンプレートテンプレートパラメータ」
15.1.7 複数ポリシーとトレイツの組み合わせ
15.1.8 一般的な反復子(General Iterator)による積算
15.2 型関数(Type Function)
15.2.1 要素型の判別
15.2.2 クラス型かどうかを判断する
15.2.3 参照と修飾子
15.2.4 上位変換トレイツ(Promotion Traits)
15.3 ポリシートレイツ
15.3.1 リードオンリーのパラメータ型
15.3.2 コピー、変換、移動
15.4 補遺
第16章 テンプレートと継承
16.1 名前付きのテンプレート引数
16.2 空のベースクラスの最適化(Empty Base Class Optimization:EBCO)
16.2.1 レイアウトの原則
16.2.2 メンバをベースクラスにする
16.3 奇妙な再帰テンプレートパターン(CRTP:Curiously Recurring Template Pattern)
16.4 パラメータ化した仮想性
16.5 補遺
第17章 メタプログラム
17.1 初めてのメタプログラムの例
17.2 列挙値と静的な定数の比較
17.3 2番目の例:平方根の計算
17.4 推論変数の使用
17.5 計算方法の完全性
17.6 再帰的なインスタンス化と、再帰的なテンプレート引数
17.7 メタプログラムを使ったループのアンロール
17.8 補遺
第18章 式テンプレート
18.1 一時変数と、ループの分断
18.2 テンプレート引数の中に式を符号化する
18.2.1 式テンプレートの被演算子
18.2.2 Array型
18.2.3 演算子
18.2.4 復習
18.2.5 式テンプレートの代入
18.4 式テンプレートのパフォーマンスと制限
18.5 補遺
● 第4部 高度な応用
第19章 型の分類
19.1 基本型を判断する
19.2 複合型を判断する
19.3 関数型を判断する
19.4 多重定義の解決を使った列挙型の分類
19.5 クラス型を判断する
19.6 全部まとめる
19.7 補遺
第20章 スマートポインタ
20.1 ホルダと転送カプセル
20.1.1 例外から保護する
20.1.2 ホルダ
20.1.3 ホルダをメンバとして使う
20.1.4 リソース確保で初期化
20.1.5 ホルダの制限
20.1.6 ホルダをコピーする
20.1.7 関数の呼び出しをまたいだホルダのコピー
20.1.8 転送カプセル
20.2 参照数を数える
20.2.1 カウンタはどこに?
20.2.2 カウンタへの同期アクセス
20.2.3 破棄と解放
20.2.4 CountingPrrテンプレート
20.2.5 単純な非浸潤カウンタ
20.2.6 シンプルな浸潤的カウンタテンプレート
20.2.7 const性
20.2.8 暗黙の変換
20.2.9 比較
20.3 補遺
第21章 ダブル
21.1 ふた組(Duo)
21.2 再帰的なduo
21.2.1 フィールドの数
21.2.2 フィールドの型
21.2.3 フィールドの値
21.3 ダブルの構築
21.4 補遺
第22章 関数オブジェクトとコールバック
22.1 直接呼出し、間接呼び出し、インライン呼び出し
22.2 関数へのポインタと参照
22.3 メンバ関数へのポインタ
22.4 クラス型のファンクタ
22.4.1 クラス型ファンクタの最初の例
22.4.2 クラス型ファンクタの型
22.5 ファンクタの指定
22.5.1 テンプレート型引数でファンクタを指定
22.5.2 関数呼び出し引数としたファンクタ
22.5.3 関数呼び出しパラメータとテンプレート型パラメータの組み合わせ
22.5.4 ノンタイプテンプレート引数としたファンクタ
22.5.5 関数ポインタのカプセル化
22.6 イントロスペクション
22.6.1 ファンクタ型の分析
22.6.2 パラメータの型にアクセスする
22.6.3 関数ポインタをカプセル化する
22.7 関数オブジェクトのコンポジション(合成)
22.7.1 シンプルなコンポジション
22.7.2 型を混合したコンポジション
22.7.3 パラメータ数を減らす
22.8 値のバインダ
22.8.1 バインディングの選択
22.8.2 バインドしたシグネチャ
22.8.3 引数の選択
22.8.4 ユーティリティ関数
22.9 ファンクタの操作:完全な実装例
22.10 補遺
付録 A One-Definitionルール
A.1 翻訳単位(Translation Units)
A.2 宣言と定義
A.3 One-Definitionルールの詳細
A.3.1 プログラム1つあたりの制約
A.3.2 翻訳単位1つあたりの制約
A.3.3 交差した翻訳単位の同一性制約
付録 B 多重定義の解決
B.1 多重定義の解決はいつ始まるのか?
B.2 単純化した多重定義の解決
B.2.1 メンバ関数に暗黙に渡される引数
B.2.2 完全一致への洗練
B.3 多重定義の詳細
B.3.1 非テンプレート版を選択する
B.3.2 変換シーケンス
B.3.3 ポインタ変換
B.3.4 関数と代理関数
B.3.5 他の多重定義の文脈
用語集
参考文献
索引
訳者あとがき
内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。
正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。
本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。
刷数は奥付(書籍の最終ページ)に記載されています。
書籍の種類:
書籍の刷数:
本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。
対象の書籍は正誤表がありません。
発生刷 | ページ数 | 書籍改訂刷 | 電子書籍訂正 | 内容 | 登録日 | ||||
---|---|---|---|---|---|---|---|---|---|
1刷 | 013 1~3行目 |
未 | 未 |
|
2010.02.22 | ||||
1刷 | 084 下から5行目 |
未 | 未 |
|
2010.04.28 |
kaizen@名古屋de朝活読書会 さん
2018-06-25
#説明歌 第二章関数テンプレートから理解できれば操り容易
Q さん
2021-04-17
C++言語におけるテンプレートという機能を主に動的な側面から入門する本。テンプレートメタプログラミングを使って依存型などコンパイル時に静的に決定される機能を作れないか考えるために手に取った。本書でその静的な側面に対する説明は少ないが、17章を読むかぎり定数とコンパイル時の再帰実行によってメタプログラミングができるように読めた。メタプログラミングをしたい人には物足りないかもしれないが、テンプレートを駆使してコードの重複を取り除こうとする設計者にはぴったりの本だろう。