Psaní vlastních manipulátorů bez argumentů
Psaní manipulátorů, které nepoužívají argumenty, nevyžaduje odvození třídy ani použití složitých maker. Předpokládejme, že vaše tiskárna vyžaduje pár ESC<>[ pro přechod do tučného režimu. Tento pár můžete vložit přímo do datového proudu:
cout << "regular " << '\033' << '[' << "boldface" << endl;
Nebo můžete definovat bold
manipulátor, který vloží znaky:
ostream& bold(ostream& os) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
Globálně definovaná bold
funkce přebírá ostream
argument odkazu a vrací ostream
odkaz. Není to členová funkce ani přítel, protože nepotřebuje přístup k žádným prvkům privátní třídy. Funkce bold
se připojuje k datovému proudu, protože operátor streamu <<
je přetížen tak, aby přijímal tento typ funkce, a to pomocí deklarace, která vypadá nějak takto:
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
Tuto funkci můžete použít k rozšíření dalších přetížených operátorů. V tomto případě je to náhodou, že bold
vloží znaky do datového proudu. Funkce se volá, když je vložena do datového proudu, ne nutně při tisku sousedních znaků. Tisk by proto mohl být zpožděn z důvodu ukládání do vyrovnávací paměti datového proudu.