Back to slide -- Keyboard shortcut: 'u'  previous -- Keyboard shortcut: 'p'  next -- Keyboard shortcut: 'n'          io/own-manipulator.cc - Programming our own manipulator - with two parameters.Lecture 3 - slide 21 : 27
Program 3

// Programming a stream manipulator with two functions:

#include <iostream>
#include <string>

using namespace std;

// A struct that encapsulates the manipulator constituents: an appropriate function pointer, a counter, and a string:
struct stream_manipulator {
  basic_ostream<char>& (*f)(basic_ostream<char>&, int, string);  // a function pointer
  int counter;                         
  string str;

  // A stream_manipulator constructor:
  stream_manipulator(basic_ostream<char>&(*ff)(basic_ostream<char>&, int, string),
         int i,
         string ss): f{ff}, counter{i}, str{ss} {
  }
};

// Overloading operator<< on basic_ostream<C,Tr> os and stream_manipulator m.
// Call m.f on the stream os, the counter in m, and the string in m:
template<typename C, typename Tr>
basic_ostream<C,Tr>& operator<<(basic_ostream<C,Tr>& os, const stream_manipulator& m){
  m.f(os, m.counter, m.str);   // call the lambda expression located in kn_endl.
  return os;                   // for chaining purposes.
}

inline stream_manipulator kn_endl(int n, string suffix){
  auto h = [](basic_ostream<char>& s, int n, string str) -> basic_ostream<char>& {
               for(int i = 0; i < n; i++) s << str << endl;
               return s;
           };
  return stream_manipulator(h, n, suffix);
}

int main(){
  int a_number{5};

  cout << "A test:" << kn_endl(a_number, "KN") 
       << a_number  << kn_endl(3, "OK") << "The end" << endl;
}