Объявить манипулятор можно так:
ostream& tab(ostream & output)
{
return output<< '\t';
}
Использовать так:
cout << 'a' << tab << 'b' << 'c' << endl;
т.е. просто передаём в поток функцию.
Работает это благодаря тому, что в шаблоне класса basic_ostream есть следующая перегрузка оператора <<:
basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& (*pf) (basic_ostream<charT,traits>&) );
Взято отсюда:
qaru.site/questions/284188/how-do-the-stream-manip...