Szablony zmiennych

Szablony zmiennych#

W C++14 zmienne mogą być parametryzowane przy pomocy typu. Takie zmienne nazywamy zmiennymi szablonowymi (variable templates). Umożliwia to definiowanie stałych, które są sparametryzowane typem.

template<typename T>
constexpr T pi = 3.141592653589793238462643383279502884;

Aby użyć zmiennej szablonowej, należy podać jej typ:

std::cout << pi<double> << '\n';
std::cout << pi<float> << '\n';

Inny przykład zmiennej szablonowej:

template<typename T>
constexpr int size = sizeof(T);

std::cout << size<int> << '\n';       // prints 4
std::cout << size<double> << '\n';    // prints 8
std::cout << size<std::string> << '\n'; // prints 32 (on 64-bit system)

Zmienne szablonowe a jednostki translacji#

Zmienne szablonowe mogą być używane w wielu jednostkach translacji (plikach źródłowych .cpp). Aby uniknąć problemów z wielokrotną definicją, deklarację zmiennej szablonowej w w pliku nagłówkowym (.hpp) poprzedzamy słowem kluczowym inline. Taka deklaracja zapewnia tzw. external linkage i zgodność z zasadą ODR (One Definition Rule).

  • plik - math_constants.hpp

template<typename T>
inline constexpr T pi = 3.141592653589793238462643383279502884;
  • plik - “unit1.cpp”

    #include "math_constants.hpp"
    
    int main()
    {
        std::cout << pi<double> << '\n'; // OK: prints 3.14159...
    }
    
  • plik - “unit2.cpp”

    #include "math_constants.hpp"
    
    void print()
    {
        std::cout << pi<float> << '\n'; // OK: prints 3.14159...
    }