2014-09-28 2 views
1

Я хочу иметь возможность объединить несколько разных аргументов в одну строку, используя ostringstream. Таким образом, я могу зарегистрировать полученную единую строку без каких-либо случайных проблем.stringstream с рекурсивной вариационной функцией?

Я получил это далеко:

template <typename T> 
    void MagicLog(T t) 
    { 
     std::cout << t << std::endl; 
    } 

    template<typename T, typename... Args> 
    void MagicLog(T t, Args... args) // recursive variadic function 
    { 
     std::cout << t << std::endl; 

     MagicLog(args...); 
    } 

    template<typename T, typename... Args> 
    void LogAll(int logType, T t, Args... args) 
    { 
     std::ostringstream oss; 
     MagicLog(t); 
     MagicLog(args...); 
     //Log(logType, oss.str()); 
    } 

Так что мне нужно заменить зЬй :: COUT с ОСС, что я сделал в функции LogAll, я попытался передать его в качестве аргумента других функций, но это было жалуясь на «удаленную функцию» ...

Итак: Как я могу получить рекурсивную вариационную функцию для принятия другого параметра - ostringstream?

+0

Какая полная ошибка? – 0x499602D2

+0

Полная ошибка была «ошибка c2280, пытающаяся ссылаться на удаленную функцию», единственное, что в ответе у меня не было, - это знак & ... – ManIkWeet

ответ

6

Я действительно не понимаю вашу проблему. Так же, как то, что вы сделали с вашей LogAll функции, передавая ostream& в качестве первого параметра works like a charm:

#include <iostream> 
#include <sstream> 

template <typename T> 
void MagicLog(std::ostream& o, T t) 
{ 
    o << t << std::endl; 
} 

template<typename T, typename... Args> 
void MagicLog(std::ostream& o, T t, Args... args) // recursive variadic function 
{ 
    MagicLog(o, t); 
    MagicLog(o, args...); 
} 

template<typename... Args> 
void LogAll(int logType, Args... args) 
{ 
    std::ostringstream oss; 
    MagicLog(oss, args...); 
    std::cout << oss.str(); 
} 

int main() 
{ 
    LogAll(5, "HELLO", "WORLD", 42); 
} 

Также можно было устранить дублирование кода из вашей MagicLog функции.

+0

Это красиво. У меня было что-то очень похожее, но без знака &, что может быть некоторым недостатком моего знания на С ++. Благодарю. – ManIkWeet

+0

@ManIkWeet Да, это могло быть проблемой. Вы не можете передать значение «ostream» по значению (без знака '&'), потому что это означает, что копирование и 'ostream' не могут быть скопированы. – Csq

+0

Имеет смысл. Не знал, что такая вещь может сделать так много вопросов. – ManIkWeet

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