To nie jest wybitny temat, może wystarczą jakieś policy based i/o dekoratory?
Albo coś takiego:
#include <iostream>
#include <string>
#include <functional>
#include <tuple>
#include <type_traits>
using namespace std;
namespace decorated_io{
namespace detail{
ostream &output(const string &str, ostream &out){
return out << str;
}
istream &input(const string &str, ostream &out, istream &in){
out << str;
return in;
}
}
namespace create{
auto output(const string &str, ostream &out){
return std::bind(decorated_io::detail::output, cref(str), ref(out));
}
auto input(const string &str, ostream &out, istream &in){
return std::bind(decorated_io::detail::input, cref(str), ref(out), ref(in));
}
auto input_and_output(const string &str, ostream &out, istream &in){
return make_tuple(input(str, out, in), output(str, out));
}
auto input_and_output(const string &out_str, const string &in_str, ostream &out, istream &in){
return make_tuple(input(in_str, out, in), output(out_str, out));
}
}
namespace get{
template<typename io_type>
auto input(io_type &io){
return std::get<0>(io);
}
template<typename io_type>
auto output(io_type &io){
return std::get<1>(io);
}
}
}
int main() {
auto io = decorated_io::create::input_and_output("#>", ">>", cout, cin);
auto input = decorated_io::get::input(io);
auto output = decorated_io::get::output(io);
output() << "hjuston, jak mnie slyszysz? #kszt" << endl;
string in;
getline(input(), in);
output() << in;
return 0;
}