In addition to function templates and class templates (cf. chapter
ref(TEMPCLASS)) bf(C++) supports em(variable templates). Variable templates
might come in handy when defining (function or class) templates defining
variables of types specified by template type parameters.

A variable template starts with a familiar tt(template) header, followed by
the definition of the variable itself. The template header specifies a type,
for which a default type may also be specified. E.g.,
        verb(
    template<typename T = long double>
    constexpr T pi = T(3.1415926535897932385);
        )

To use this variable a type must be specified, and as long as the initialized
value can be converted to the specified type the conversion is silently 
performed by the compiler:
        verb(
    cout << pi<> << ' ' << pi<int>;
        )
    At the second insertion the tt(long double) initialization value is
converted to tt(int), and 3 is displayed.

Specializations are also supported. E.g., to show the text `pi' a
specialization for a tt(char const *) type can be defined:
        verb(
    template<>
    constexpr char const *pi<char const *> = "pi";
        )
With this specialization we can do tt(cout << pi<char const *>) to show
tt(pi). 


