C++14 変数テンプレート

N3651 - Variable Templates (Revision 1)


C++11には、関数テンプレート、クラステンプレート、エイリアステンプレート、リテラル演算子テンプレート、可変引数テンプレートといったテンプレートがありますが、C++14では変数テンプレート(Variable Templates)というものが追加されます。


これは、変数の定義にテンプレートを使用可能にし、変数定義を特定の型で特殊化可能にするというものです。たとえば、円周率πの変数は、以下のように定義できます。

// 円周率変数piの定義
template<typename T>
constexpr T pi = T(3.1415926535897932385);
// テンプレート定義された変数の使い方
// 円の面積を求める
template<typename T>
T area_of_circle_with_radius(T r) {
  return pi<T> * r * r;
}

円周率は通常、組み込み型で表現できる範囲であれば、リテラルとして定義されます。しかし、多倍長浮動小数点数型のような場合には、リテラルでは表現できないので、演算によって求める必要があります。そういう状況で、多倍長演算型で値を特殊化して定義するために変数テンプレートを使用できます。
Boost.Mathではまさにこういう特殊化をやっていますが、値を表現するために関数を使用しています。


変数テンプレートは関数テンプレートと違い、完全な特殊化以外に、部分特殊化も使用できます。