2009-03-03 6 views
8

Angenommen, ich habe eine Reihe von Funktionen und Klassen, die Vorlagen für die Verwendung einzelner (float) oder double Präzision sind. Natürlich könnte ich nur zwei Teile Bootstrap-Code schreiben, oder Chaos mit Makros. Aber kann ich das Template-Argument zur Laufzeit wechseln?Wählen Sie Vorlage Argument zur Laufzeit in C++

Antwort

19

Nein, Sie können Vorlagenargumente nicht zur Laufzeit wechseln, da Vorlagen vom Compiler zur Kompilierungszeit instanziiert werden. Was Sie können tun ist, beide Vorlagen von einer gemeinsamen Basisklasse ableiten haben, immer die Basisklasse in Ihrem Code, und dann entscheiden, welche Klasse zur Laufzeit zu verwenden, abgeleitet:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

Makros haben das gleiche Problem wie Vorlagen, indem sie zur Kompilierzeit expandiert werden.

3

Vorlagen sind ein Mechanismus zur Kompilierung. BTW, Makros sind auch (streng genommen - ein Vorverarbeitungs-Mechanismus - der sogar vor der Kompilierung kommt).

2

Vorlagen sind reine Kompilierzeitkonstrukte, der Compiler erweitert eine Vorlage und erstellt Ihre Klasse/Funktion mit dem angegebenen Argument und übersetzt diese direkt in Code.

Wenn Sie versuchen, zur Laufzeit zwischen foo<float> und foo<double> umzuschalten, müssen Sie entweder einige Metaprogrammierungstricksen verwenden oder für jedes Programm separate Codepfade verwenden.