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ではまさにこういう特殊化をやっていますが、値を表現するために関数を使用しています。
変数テンプレートは関数テンプレートと違い、完全な特殊化以外に、部分特殊化も使用できます。