Почему мой рекурсивный шаблон variadi c не компилируется? - PullRequest
0 голосов
/ 15 января 2020

Хотелось бы немного лучше понять шаблоны 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
}

1 Ответ

2 голосов
/ 15 января 2020

Vexing parse with:

std::stringstream strs(); Объявление функции

Использование

std::stringstream strs{};

или

std::stringstream strs;

Демо

...