Мой вывод таков: когда компилятор видит шаблон, он фактически выполняет замену строки в исходном коде, прежде чем пытаться скомпилировать результат.
Это можно проиллюстрировать примером.
Код: Выделить всё
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);
Код: Выделить всё
Stringable stringable;
std::string tmp = stringable.to_string();
Пример можно расширить и, возможно, сделать более понятным, введя еще одну функцию, которая не компилируется ни для одной из трех структур примера.
Код: Выделить всё
// 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));
}
И это все, что нужно? Если да, то шаблоны кажутся на самом деле очень простыми. Не знаю, почему я решил, что они должны быть намного сложнее.
Подробнее здесь: https://stackoverflow.com/questions/798 ... performing
Мобильная версия