C ++ 0x verfügt über Vorlagenaliasnamen (manchmal auch als Vorlagentypedefs bezeichnet). Siehe hier . Aktuelle Spezifikation von C ++ nicht.
Was verwenden Sie gerne als Workaround? Containerobjekte oder Makros? Findest du es wert?
c++
templates
type-safety
George Godik
quelle
quelle
Antworten:
Der kanonische Weg besteht darin, eine Metafunktion wie folgt zu verwenden:
template <typename T> struct my_string_map { typedef std::map<std::string, T> type; }; // Invoke: my_string_map<int>::type my_str_int_map;
Dies wird auch in STL (
allocator::rebind<U>
) und in vielen Bibliotheken einschließlich Boost verwendet. Wir verwenden es ausgiebig in einer bioinformatischen Bibliothek .Es ist aufgebläht, aber in 99% der Fälle die beste Alternative. Die Verwendung von Makros hier ist die vielen Nachteile nicht wert.
(BEARBEITEN: Ich habe den Code geändert, um die Boost / STL-Konventionen widerzuspiegeln, auf die Daniel in seinem Kommentar hingewiesen hat.)
quelle
Sie sollten nicht von Klassen erben, die keinen virtuellen Destruktor haben. Es hängt damit zusammen, dass Destruktoren in abgeleiteten Klassen nicht aufgerufen werden, wenn sie sollten, und dass Sie möglicherweise nicht zugewiesenen Speicher haben.
Davon abgesehen könnten Sie in der obigen Instanz wahrscheinlich damit durchkommen, weil Sie Ihrem abgeleiteten Typ keine weiteren Daten hinzufügen. Beachten Sie, dass dies keine Bestätigung ist. Ich rate dir immer noch, es nicht zu tun. Die Tatsache, dass Sie es tun können, bedeutet nicht , dass Sie es sollten .
EDIT: Ja, dies ist eine Antwort auf den Beitrag von ShaChris23. Ich habe wahrscheinlich etwas verpasst, weil es über seiner / ihrer Nachricht statt unter angezeigt wurde.
quelle
Manchmal können Sie einfach die nicht vorgestellten Typedefs für alle erforderlichen Typen explizit ausschreiben. Wenn die Basisklasse auf mehreren Vorlagenargumenten mit nur einem Typ erstellt wird, der typisiert werden soll, können Sie eine spezialisierte Klasse erben, wobei typedef effektiv im geerbten Klassennamen enthalten ist. Dieser Ansatz ist weniger abstrus als der Metafunktionsansatz.
quelle