2014-03-02 24 views

Antwort

21

Sie können solche Typen nicht übergeben, weil Typen keine Objekte sind. Sie sind zur Laufzeit nicht vorhanden. Stattdessen möchten Sie eine Vorlage, die Sie Funktionen mit verschiedenen Typen bei der Kompilierung zu instanziiert erlaubt:

template <typename T> 
void foo() { 
    cout << sizeof(T); 
} 

Sie können diese Funktion mit aufrufen, beispielsweise foo<int>(). Es würde eine Version der Funktion mit T durch int ersetzt werden. Nachschlagen function templates.

+0

Tun Sie dies nur, wenn Sie sich nicht um die Übersetzungsgeschwindigkeit kümmern. –

+0

@RayGarner wie meinst du? Sind nicht zwei Template-Instanzen nur so teuer wie zwei Klassen oder? Mein Verständnis ist, dass Templates die Kompilierzeit wegen der versteckten Klassen erhöhen, nicht weil Templates irgendwie teuer sind. – TankorSmash

+0

@TankorSmash Right gut skalieren ist der Punkt, solange sein klein genug Projekt und Maßstab müssen Sie sich nicht wirklich darum kümmern. Aber jedes kleine Projekt wird zu einem großen Projekt, also nur für den Fall, dass ein FNG gelesen werden sollte, wollte er nur wissen, dass der Kompromiss in den Kompilierungszeiten bekannt ist. –

8

Wie Joseph Mansfield darauf hingewiesen hat, wird eine Funktionsvorlage tun, was Sie wollen. In einigen Situationen kann es sinnvoll sein, einen Parameter an die Funktion hinzuzufügen, so dass Sie das Template-Argument muss nicht explizit angeben:

template <typename T> 
void foo(T) { 
    cout << sizeof(T) 
} 

Das ermöglicht es Ihnen, die Funktion als foo(x) zu nennen, wo x ist eine Variable vom Typ T. Die parameterlose Version müsste als foo<T>() aufgerufen werden.

Verwandte Themen