Jeśli zdefiniujesz operator<<
jako funkcję składową, będzie ona miała inną zdekomponowaną składnię niż w przypadku użycia funkcji niebędącej składową operator<<
. Element niebędący członkiem operator<<
jest operatorem binarnym, gdzie element członkowski operator<<
jest operatorem jednoargumentowym.
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
Więc… jak naprawdę je nazywasz? Operatory są pod pewnymi względami dziwne, wezwam cię do napisania operator<<(...)
składni w twojej głowie, aby wszystko miało sens.
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
Lub możesz spróbować wywołać operator binarny niebędący składnikiem:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
Nie masz obowiązku zmuszać tych operatorów do zachowywania się intuicyjnie, gdy przekształcasz je w funkcje składowe, możesz zdefiniować operator<<(int)
przesunięcie w lewo jakiejś zmiennej składowej, jeśli chcesz, zrozum, że ludzie mogą być nieco zaskoczeni, bez względu na to, ile komentarzy możesz pisać.
Prawie na koniec mogą zdarzyć się sytuacje, w których obie dekompozycje dla połączenia operatora są prawidłowe, możesz mieć tutaj kłopoty, a my odłożymy tę rozmowę.
Na koniec zwróć uwagę, jak dziwne może być napisanie jednoargumentowego operatora składowego, który ma wyglądać jak operator binarny (ponieważ możesz sprawić, że operatorzy elementów członkowskich będą wirtualnymi ..... również próbując nie zdecentralizować i nie spuścić tej ścieżki ... )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
Ta składnia będzie teraz irytować wielu programistów ...
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
Zwróć uwagę, dlaczego tutaj cout
jest drugi argument w łańcuchu… dziwne, prawda?