Frage

C++ 0x verfügt über Vorlagenaliase (manchmal auch als Vorlagentypdefinitionen bezeichnet).Sehen Hier.Die aktuelle Spezifikation von C++ tut dies nicht.

Was nutzen Sie gerne als Workaround?Containerobjekte oder Makros?Glauben Sie, dass es sich lohnt?

War es hilfreich?

Lösung

Was nutzen Sie gerne als Workaround?Containerobjekte oder Makros?Glauben Sie, dass es sich lohnt?

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 der STL verwendet (allocator::rebind<U>) und in vielen Bibliotheken, einschließlich Boost.Wir verwenden es ausgiebig in a Bioinformatische Bibliothek.

Es ist zwar aufgebläht, aber in 99 % der Fälle die beste Alternative.Die Verwendung von Makros ist hier die vielen Nachteile nicht wert.

(BEARBEITEN:Ich habe den Code geändert, um die Boost/STL-Konventionen widerzuspiegeln, wie Daniel in seinem Kommentar hervorgehoben hat.)

Andere Tipps

template <typename T>
struct my_string_map : public std::map<std::string,T> 
{
};

Sie sollten nicht von Klassen erben, die keinen virtuellen Destruktor haben.Dies hängt damit zusammen, dass Destruktoren in abgeleiteten Klassen nicht zum richtigen Zeitpunkt aufgerufen werden und es zu nicht zugewiesenem Speicher kommen kann.

Abgesehen davon könnten Sie im obigen Beispiel wahrscheinlich damit durchkommen, weil Sie keine weiteren Daten zu Ihrem abgeleiteten Typ hinzufügen.Beachten Sie, dass dies keine Empfehlung ist.Ich rate dir immer noch nicht Tu es.Die Tatsache, dass Sie dürfen Tu es, meint nicht dich sollen.

BEARBEITEN:Ja, dies ist eine Antwort auf den Beitrag von ShaChris23.Ich habe wahrscheinlich etwas übersehen, weil es über seiner/ihrer Nachricht und nicht darunter angezeigt wurde.

Manchmal können Sie die Typdefinitionen ohne Vorlage für alle erforderlichen Typen einfach explizit ausschreiben.Wenn die Basisklasse auf mehreren Vorlagenargumenten basiert und nur ein Typ typdefiniert 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top