Хотелось бы немного лучше понять шаблоны c variadi, поэтому я написал функцию, которая принимает любое количество аргументов, преобразует их в строки, добавляет их в поток строк и печатает этот поток. Я ожидал бы, что компилятор перейдет с \\1
до \\2
до \\3
до \\4
до \\5
(сравните код). Но вместо этого он застрял на \\2
. Почему это так?
Разве компилятор не должен принимать регистр, который является "наиболее подходящим" для вызова функции? Мое понимание шаблонов variadi c заключается в том, что вы go сверху вниз и от базового варианта к исключению. Я ожидал бы, что в \\2
, когда вызывается print(strs, "this", " is ", "a ", "test ", 1, 2, 'a')
, это будет go до \\3
.
Играть с этим кодом.
#include <string>
#include <iostream>
#include <sstream>
void print(std::string msg) // 5
{
std::cout << msg;
}
template <class T>
void print(std::stringstream &strs, T t) // 4
{
strs << std::to_string(t);
print(strs.str());
}
template <class... Args, class T>
void print(std::stringstream &strs, T t, Args... args) // 3
{
strs << t;
print(strs, args...);
}
template <class... Args>
void print(Args... args) // 2
{
std::stringstream strs();
print(strs, args...);
}
int main()
{
print("this", " is ", "a ", "test ", 1, 2, 'a'); // 1
}