C++11
C++03では、ある翻訳単位で完全に引数が特定されたテンプレートが見つかったとき、コンパイラは常にそのテンプレートを実体化しなければならない。このことはコンパイルの時間を劇的に増加させる。特に、同じパラメータを用いたテンプレートが複数の翻訳単位で実体化されるときは顕著である。そして、C++03 にはそのようなテンプレートの実体化を止めさせる手段もなかった。C++11 では、これに対して外部テンプレートが導入された(これは外部変数に対するアナロジーである)。
C++03 には、特定の場所での実体化を強制的にコンパイラに命じる構文がある。
C++11 では、以下のような構文が導入された。
これにより、コンパイラはこの翻訳単位ではテンプレートの実体化をしないようになる。
C++03では、sizeof演算子は型とオブジェクトに対してしか適用できない。そのため、以下のようには使用できない:
この例では、OtherTypeのサイズを取得したい場面であるが、C++03ではこれは不正となりコンパイルエラーとなる。C++11では認められる。
ちなみに、C++03で同様のことをしたい場合、以下のようにすればよい:
タプルとは、決められた次元数の、異なる種類の型のオブジェクトから構成されたコレクションである。ペア (std::pair) を拡張して、任意の数のオブジェクトを格納できるようにしたものと考えても良い。あらゆる型のオブジェクトが、タプルの要素になりうる。
この新ユーティリティは、新ヘッダとC++言語拡張を通して実装される。つまり:
可変長引数テンプレート
参照への参照
関数テンプレートのデフォルト引数(C++03ではクラステンプレートにしかデフォルト引数を定義できない)
以下が、<tuple>ヘッダで定義されているタプルである:
タプル型の定義例と使用例を挙げる:
タプルproofを内容の定義なしに生成することも可能であるが、タプル要素の型がデフォルトコンストラクタを持つ場合に限られる。さらに、タプルを別のタプルに代入することも可能である。ただし、代入可能なのは、タプルの型が同じで各要素の型がコピーコンストラクタを持つ場合、もしくは右辺側のタプルの各型が左辺側のタプルのそれぞれの型と変換可能な場合、左辺側のタプルの各要素型が適切なコンストラクタを持つ場合である。
比較演算子も使用可能であり(タプルの要素数が同じ場合)、タプルの特性を確認する2つの式が使用可能である(コンパイル時のみ)。
std::tuple_size<T>::value: タプルTの要素数を返す。
std::tuple_element<I, T>::type: タプルTのI番目のオブジェクトの型を返す。
以下の機能は、主に何らかのパフォーマンス向上を狙ったものである。スピードの向上とメモリ効率の改善の両方が含まれる。