000
30.01.2013, 14:02 Uhr
ao
(Operator)
|
Hallo zusammen, ich hab ne Frage zu Funktions-Templates.
Ich habe einen einfachen Datenspeicher:
C++: |
class DataStorage { // Eine Liste von Name-Wert-Paaren. // Beispielhafter Inhalt: // X-START=0.0 // X-DELTA=0.1 // NUM-SAMPLES=1000 std::unordered_map<std::string, std::string> nameValuePairs;
public: // Funktion, um zu einem Namen den Wert zu holen, und zwar // gleich als Zahlenwert im passenden Datentyp. // Für RT kommen nur Trivialtypen in Frage (int, double, ...) template <typename RT> RT GetValue (const std::string & name) { std::stringstream ss (nameValuePairs[name]); RT value; ss >> value; return value; } };
|
Geplante Verwendung:
C++: |
int main () { DataStorage storage; // Hier Storage mit Daten füllen // Abfragen: double xDelta = storage.GetValue ("X-DELTA"); int numSamples = storage.GetValue ("NUM-SAMPLES"); }
|
Problem: Mein Compiler (zur Zeit Visual Studio 2010, demnächst auch gcc) kann das Template nicht nur anhand des Rückgabetypes spezialisieren.
Etwas unschöner Workaround: Dem Compiler mit einem Dummy-Parameter auf die Sprünge helfen: Indem ich eine Variable oder auch ein Literal vom entsprechenden Typ hineinstecke, weiß der Compiler, was ich mit RT meine.
C++: |
template <typename RT> RT GetValue (RT specifyType, const std::string & name) { std::stringstream ss (nameValuePairs[name]); RT value; ss >> value; return value; }
double xDelta = storage.GetValue (1.0, "X-DELTA"); int numSamples = storage.GetValue (1, "NUM-SAMPLES");
|
Gibts auch einen "richtigen" Weg dafür?
Vielen Dank! Dieser Post wurde am 30.01.2013 um 14:37 Uhr von ao editiert. |