Sdílet prostřednictvím


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.

Viz také

Výstupní streamy