Char* oder std:String als Parameter einer Template Funktion ?
-
Ich habe folgende Template Funktion und bin am überlegen ob ich beim ersten Parameter auch einen Char* zu verwenden darf. Wäre das nicht aus Performance gründen sinnvoller? Oder habe ich da dann nacher ein Speicherleck?
template <typename T> void assertNotOutsideRange(const std::string name, const T value, const T from, const T to) { if (value > to || value < from) { std::ostringstream buf; buf << name << ": expected value between " << from << " and " << to << ", but get " << value; throw std::range_error( buf.str() ); } }So verwende ich die Funktion:
assertNotOutsideRange("x",x,0,width-1);
-
A) Übergebe alle Parameter (auch die unbekannten Typs - könnte ja was anderes als POD sein) als const Referenz, dann hast Du keine Performanceprobleme
Wenn Du nicht per Referenz übergibst, ist das const fürchterlich überflüssig 
template <typename T> void assertNotOutsideRange(const std::string& name, const T& value, const T& from, const T& to)
-
und auch wenn du ein char* übergibst, dürftest du keine Speicherlücke haben, da String-Literale automatisch aufgeräumt werden (außer natürlich, du erzeugst den Paramter für die Funktion per new).
-
Danke an euch zwei

Spricht etwas dagen die Methoden zu überladen? So dass ich einmal Char* als ersten Parameter habe und das andere mal std:String. Oder macht man sowas nicht?
also
template <typename T> void assertNotOutsideRange(const std::string& name, const T& value, const T& from, const T& to) { if (value > to || value < from) { std::ostringstream buf; buf << name << ": expected value between " << from << " and " << to << ", but get " << value; throw std::range_error( buf.str() ); } } template <typename T> void assertNotOutsideRange(const char* name, const T& value, const T& from, const T& to) { if (value > to || value < from) { std::ostringstream buf; buf << name << ": expected value between " << from << " and " << to << ", but get " << value; throw std::range_error( buf.str() ); } }MfG
IFlo
-
theoretisch ist es möglich, aber praktisch macht es weniger Sinn - wenn du wirklich sowohl String-Literale als auch std::string's an die Funktion übergeben willst, reicht eine Version für "const std::string&" (die kann auch char*'s entgegennehmen).