Meine Schlussfolgerung ist, dass der Compiler, wenn er eine Vorlage sieht, im Quellcode praktisch eine Zeichenfolgenersetzung durchführt, bevor er versucht, das Ergebnis zu kompilieren.
Dies kann anhand eines Beispiels veranschaulicht werden.
Code: Select all
struct StringableThing1 {
std::string to_string() { return std::string("hello world"); }
};
struct StringableThing2 {
std::string name;
std::string to_string() { return name; }
};
struct NotAStringableThing {
std::vector data;
std::vector to_binary_string() { return data; }
};
template
void do_something(Stringable something) {
std::string some_string = something.to_string();
std::println(some_string);
}
// works
StringableThing1 thing1;
do_something(thing1);
// works
StringableThing2 thing2;
do_something(thing2);
// does not work
NotAStringableThing thing3;
do_something(thing3);
Code: Select all
Stringable stringable;
std::string tmp = stringable.to_string();
Das Beispiel kann weiter erweitert werden und wird möglicherweise klarer, indem eine weitere Funktion eingeführt wird, die für keine der drei Beispielstrukturen kompiliert wird.
Code: Select all
// note same template parameter name chosen deliberately here -
// not the same `Stringable` as before
template
void do_something(Stringable something) {
std::string some_string = something.to_string();
std::println(some_string);
std::vector some_binary_string = something.to_binary_string();
std::println(binary_string_to_utf8(some_binary_string));
}
Ist das alles? Wenn ja, scheinen Vorlagen eigentlich sehr einfach zu sein. Ich weiß nicht, warum ich angenommen habe, dass sie viel komplizierter sein müssen.
Mobile version