2
переменных числа

Я пытаюсь написать обобщенную функцию для входа некоторого материала для отладки, и я хочу, чтобы назвать это, например, так:Возникли проблемы с C++ параметров шаблона

Log("auo", 34); //writes: auo34 

Point point; 
point.X = 10; 
point.Y = 15; 
Log(35, point, 10); //writes: 35{10, 15}10 

Однако, у меня всевозможные проблемы с упаковкой параметров и распаковкой, я не могу понять, что это происходит. Ниже приведен полный код:

struct Point { 
    long X, Y; 
} 

std::ofstream debugStream; 

template<typename ...Rest> 
void Log(Point first, Rest... params) { //specialised for Point 
    if (!debugStream.is_open()) 
     debugStream.open("bla.log", ios::out | ios::app); 
    debugStream << "{" << first.X << ", " << first.Y << "}"; 
    Log(params...); 
} 

template<typename First, typename ...Rest> 
void Log(First first, Rest... params) { //generic 
    if (!debugStream.is_open()) 
     debugStream.open("bla.log", ios::out | ios::app); 
    debugStream << first; 
    Log(params...); 
} 

Как исправить функции, пожалуйста?

+2

Вам необходимо предоставить базовый футляр для последнего рекурсивного вызова, когда пакет параметров будет пустым и будет вызываться вызов 'Log()'. Добавление «void Log() {}' перегрузки должно быть достаточно. – DeiDei

ответ

4

Рассмотрим следующий упрощенный вариант:

void print() {} 

template<typename First, typename... Rest> 
void print(const First& first, const Rest&... rest) 
{ 
    std::cout << first; 
    print(rest...); 
} 

Когда sizeof...(Rest) == 0 вызов print() без параметров будет выдан, который требует от перегрузки базового случая выше.

Смежные вопросы