2016-12-13 17 views
0
template<typename T, typename F, typename L> 
void print(const T& s, F first, L last) 
{ 
    os << s << " = (\n"; 

    os << charInput1; 
    std::copy(first, last, std::ostream_iterator<int>(std::cout, "\n")); 
    os << charInput2; 

    os << "\n)"; 
} 

Я пытаюсь выполнить заказную печать cout. Эта функция-член принадлежит классу CustomPrinter, а charInput1 и charInput2 являются его частными членами char, которые определяются при создании пользовательского принтера. Предполагаются итераторы first и last, а s - строка.C++ basic custom cout printing to consle

Так, например, при charInput1 является + знаком, и charInput2 является периодом ., я бы ожидать, что конечный результат будет следующим, учитывая std::vector<int> = {1, 1, 1}:

(
+1. 
+1. 
+1. 
) 

Но я получаю

Так что мой вопрос в том, что еще нужно для печати заданного char между каждым элементом вектора? Можно ли использовать только std::ostream_iterator<int>(std::cout, /* char here? */)? Поскольку кажется, что этот метод может только вставлять строки между ними, мне также нужно вставить их. Если нет, то какой может быть лучший подход? Заранее спасибо!

Edit: В моем основном я имею

CustomPrinter cp(std::cout, '+', '.'); 
std::vector<int> v = {1, 1, 1}; 
cp.print("result", v.begin(), v.end()); // function call.. 
+0

Опубликовать полный, компилируемый пример того, как вы называете эту функцию. –

+0

@latedeveloper Привет, Я добавил, как была вызвана функция. – user3941584

+0

Почему вы жестко закодировали '' в качестве имени для 'ostream_iterator'? Разве это не из шаблона класса? – Barmar

ответ

0

Просто используйте обычный цикл:

template<typename T, typename F, typename L> 
void print(const T& s, F first, L last) 
{ 
    os << s << " = (\n"; 
    for (auto el = first; el != last; el++) { 
     os << charInput1 << *el << charInput2 << "\n"; 
    }  
    os << ")"; 
} 

На самом деле, вы могут сделать это с помощью std::ostream_iterator, конкатенации вокруг ваших персонажей.

template<typename T, typename F, typename L> 
void print(const T& s, F first, L last) 
{ 

    std::string sep = charInput1 + std::string("\n") + charInput2; 
    os << s << " = (\n"; 
    if (first != last) { // Don't print first prefix and last suffix if the sequence is empty 
     os << charInput1; 
     std::copy(first, last, std::ostream_iterator<int>(std::cout, sep.c_str())); 
     os << charInput2; 
    } 
    os << "\n)"; 
} 
+0

Спасибо! Ваше редактирование было действительно полезным и было тем, что я искал, в дополнение к вашему предложению в цикле, который, конечно, тоже работал. – user3941584

+0

Btw, ваш компилятор жалуется на 'ostream_iterator (std :: ostream &, std :: string &)'? – user3941584

+0

Я не пробовал, но теперь вижу, что 'delimiter' должен быть' char * ', а не' std :: string'. Я использовал '.c_str()', чтобы получить его. – Barmar

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

  • Нет связанных вопросов^_^