Aliasy szablonów#

Aliasy typów#

W C++11 deklaracja using może zostać użyta do tworzenia bardziej czytelnych aliasów dla typów - zamiennik dla typedef.

using CarID = int;

using Func = int(*)(double, double);

using DictionaryDesc = std::map<std::string, std::string, std::greater<std::string>>;

Aliasy szablonów#

Aliasy typów mogą być parametryzowane typem. Można je wykorzystać do tworzenia częściowo związanych typów szablonowych.

template <typename T>
using StrKeyMap = std::map<std::string, T>;

StrKeyMap<int> my_map; // std::map<std::string, int>

Parametrem aliasu typu szablonowego może być także stała znana w czasie kompilacji:

template <std::size_t N>
using StringArray = std::array<std::string, N>;

StringArray<255> arr1;

Aliasy szablonów nie mogą być specjalizowane.

template <typename T>
using MyAllocList = std::list<T, MyAllocator>;

template <typename T>
using MyAllocList = std::list<T*, MyAllocator>; // error

Przykład utworzenia aliasu dla szablonu klasy smart pointer’a:

template <typename Stream>
struct StreamDeleter
{
    void operator()(Stream* os)
    {
        os->close();
        delete os;
    }
}

template <typename Stream>
using StreamPtr = std::unique_ptr<Stream, StreamDeleter<Stream>>;

// ...
{
    StreamPtr<ofstream> p_log(new ofstream("log.log"));
    *p_log << "Log statement";
}

Aliasy i typename#

Od C++14 biblioteka standardowa używa aliasów dla wszystkich cech typów, które zwracają typ.

template <typename T>
using is_void_t = typename is_void<T>::type;

W rezultacie kod odwołujący się do cechy:

typename is_void<T>::type

możemy uprościć do:

is_void_t<T>;