Aliase
Sie können eine Aliasdeklaration verwenden, um einen Namen zu deklarieren, der als Synonym für einen zuvor deklarierten Typ verwendet wird. (Dieser Mechanismus wird informell auch als Typalias bezeichnet). Sie können diesen Mechanismus auch verwenden, um eine Aliasvorlage zu erstellen, die für benutzerdefinierte Zuweisungen besonders nützlich sein kann.
using identifier = type;
Hinweise
identifier
Der Name des Alias.type
Der Typbezeichner, für den Sie einen Alias erstellen.
Ein Alias führt keinen neuen Typ ein und kann die Bedeutung eines vorhandenen Typnamens nicht ändern.
Die einfachste Form eines Alias entspricht dem typedef-Mechanismus von C++03:
// C++11
using counter = long;
// C++03 equivalent:
// typedef long counter;
Beides ermöglicht die Erstellung von Variablen des Typs "counter". Nützlicherer wäre ein Typalias wie dieser für std::ios_base::fmtflags:
// C++11
using fmtfl = std::ios_base::fmtflags;
// C++03 equivalent:
// typedef std::ios_base::fmtflags fmtfl;
fmtfl fl_orig = std::cout.flags();
fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex;
// ...
std::cout.flags(fl_hex);
Aliase arbeiten auch mit Funktionszeigern, sind aber viel besser lesbar als das Typedef-Äquivalent:
// C++11
using func = void(*)(int);
// C++03 equivalent:
// typedef void (*func)(int);
// func can be assigned to a function pointer value
void actual_function(int arg) { /* some code */ }
func fptr = &actual_function;
Eine Einschränkung des typedef-Mechanismus besteht darin, dass er nicht mit Vorlagen arbeitet. Die Typaliassyntax in C++11 ermöglicht jedoch die Erstellung von Aliasvorlagen:
template<typename T> using ptr = T*;
// the name 'ptr<T>' is now an alias for pointer to T
ptr<int> ptr_int;
Beispiel
Das folgende Beispiel zeigt die Verwendung einer Aliasvorlage mit einer benutzerdefinierten Zuweisung, in diesem Fall einem ganzzahligen Vektortyp. Sie können jeden Typ für int ersetzen, um einen zweckmäßigen Alias zu erstellen, damit die komplexen Parameterlisten im Hauptfunktionscode ausgeblendet werden. Indem Sie die benutzerdefinierte Zuordnung im gesamten Code verwenden, können Sie die Lesbarkeit verbessern und das Risiko von Fehlern verringern, die sich aufgrund von Schreibfehlern einschleichen können.
#include <stdlib.h>
#include <new>
template <typename T> struct MyAlloc {
typedef T value_type;
MyAlloc() { }
template <typename U> MyAlloc(const MyAlloc<U>&) { }
bool operator==(const MyAlloc&) const { return true; }
bool operator!=(const MyAlloc&) const { return false; }
T * allocate(const size_t n) const {
if (n == 0) {
return nullptr;
}
if (n > static_cast<size_t>(-1) / sizeof(T)) {
throw std::bad_array_new_length();
}
void * const pv = malloc(n * sizeof(T));
if (!pv) {
throw std::bad_alloc();
}
return static_cast<T *>(pv);
}
void deallocate(T * const p, size_t) const {
free(p);
}
};
#include <vector>
using MyIntVector = std::vector<int, MyAlloc<int>>;
#include <iostream>
int main ()
{
MyIntVector foov = { 1701, 1764, 1664 };
for (auto a: foov) std::cout << a << " ";
std::cout << "\n";
return 0;
}