C>Вовсе не вижу причин обязательно реализовывать манипулятор через вывод в поток функции от потока…
Смысл в том что бы не трогать класс потока. Вовторых, черезмерная перегрузка оператора вывода может вызвать ряд проблем.
К>.....
К>void doit(std::ostream&, int t1=0, int t2=0);
К>void hello(const char*, std::ostream&);
К>void byebye(std::ostream&, const char*);
К>void jabberwacky(int x, int y, int z, int t, std::ostream&);
К>.....
К>// если нельзя просто записать cout << doit, всегда можно завернуть её в fmanip
К>std::cout << fmanip(doit);
К>// связывать можно любым подходящим способом
К>std::cout << fmanip(boost::bind(hello,"world"));
К>std::cout << fmanip(std::bind1st(std::ptr_fun(hello),"world"));
К>// если поток - не последний аргумент, то связываем соответственно
К>std::cout << fmanip(std::bind2nd(std::ptr_fun(byebye),"baby"));
К>// если много аргументов - то boost::bind или boost::lambda нас спасут
К>std::cout << fmanip(boost::bind(jabberwacky,1,2,3,4));
К>// наконец, можно связать заранее
К>boost::function<void(std::ostream&)> f = boost::bind(jabberwacky,1,2,3,4);
К>std::cout << fmanip(f);
К>.....
К>
Спасибо, довольно интересно, но не подходит, виртуальный базовый класс не подходит потому что все эти функции дожны быть встроены. Вариант с fmanip тоже не катит, поскольку в результате это должно выглядеть несколько иначе:
stream << do_this(t1, t2, t3)
<< and_this(t1, t2)
;
Поповоду макросов, как передать в макросу аргумент с запятыми?