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).


Anmelden zum Antworten