Frage zu Überladenem Konstruktor
-
Ich bin gerade dabei, Template Funktionen zu lernen. Dabei habe ich eine Frage: Wenn ich zB 2 Konstruktoren habe
class Klasse { Klasse(const std::string&); template<typename T> Klasse(const T&); };und ich erzeuge ein Objekt über einen string, wird dann immer der Konstruktor aufgerufen, der explizit das Verhalten bei Übergabe eines Strings regelt oder wird hier der Teplate Konstruktor aufgerufen? Ist es im Standard irgendwie festgeschrieben, dass bei einem solchen Fall der string Konstruktor die beste Übereinstimmung ist?
-
Es wird eigentlich immer die Version aufgerufen, die am meisten spezialisiert ist. Das heisst, wenn eine
const std::string&-Überladung existiert und du einenstd::stringübergibst, kommt diese zum Zug.Der Template-Konstruktor sollte bestimmt nur ein Beispiel sein. Ich frage mich, was der hier bringen würde...

-
Der Sinn ist Folgender:
Ich habe mir zur Übung eine "BigNumber" Klasse geschrieben. Objekte dieser Klasse erzeuge ich so:BigNumber zahl("999999999999999999999999.99999");Die Zahlen sind short-Arrays. Außerdem soll diese Klasse kompatibel zu den elementaren Typen sein. Eine solche Initialisierung soll auch möglich sein
BigNumber zahl(200.123);Intern läuft dabei Folgendes ab
template<typename T> BigNumber::BigNumber(const T& var) { std::ostringstream Str; Str << std::setprecision(400) << var; std::string tmp(Str.str()); (*this)=tmp; }Das heißt, die "normale Initialisierung" ist der Weg über std::string (bzw. const char*), während der "Umweg" von anderen Typen wieder über std::string läuft.
Das ist der ganze Sinn dahinter