Code:
template <typename T>
class MyList : public std::list<T>
{
public:
MyList& operator << (const T& elem);
};
template <typename T>
MyList<T>& MyList<T>::operator <<(const T &elem)
{
push_back(elem);
return *this;
}
template <typename T>
class MyList : public std::list<T>
{
public:
MyList& operator << (const T& elem);
};
template <typename T>
MyList<T>& MyList<T>::operator <<(const T &elem)
{
push_back(elem);
return *this;
}
Tako da se sada lista moze popunjavati na sledeci nacin:
Code:
MyList<std::string> data;
data << "Jedan";
data << "Dva";
data << "Tri";
MyList<std::string> data;
data << "Jedan";
data << "Dva";
data << "Tri";
Kasnije sam uvideo da postoji bolji nacin gledajuci operator << za ostream koji mi je dao ideju:
Code:
template <typename T>
std::list<T>& operator << (std::list<T>& list, const T& elem)
{
list.push_back(elem);
return list;
}
template <typename T>
std::list<T>& operator << (std::list<T>& list, const T& elem)
{
list.push_back(elem);
return list;
}
Ovo "magicno" dodaje funkcionalnost klasi std::list da koristi operator << kao u Qt-u.
Code:
std::list<std::string> data;
data << "Jedan";
data << "Dva";
data << "Tri";
std::list<std::string> data;
data << "Jedan";
data << "Dva";
data << "Tri";
Do sada sam mislio da je overload operatora << vezan samo za ostream i da posebne STL konstrukcije omogucavaju koriscenje operatora << na gore navedeni nacin i
prijatno sam se iznenadio kada sam video da operator << moze da se koristi i za druge stvari.
Uprosticu primer za operator << da bi se lakse razumelo pitanje:
Code:
std::list<int>& operator << (std::list<int>& list, const int& elem)
{
list.push_back(elem);
return list;
}
std::list<int>& operator << (std::list<int>& list, const int& elem)
{
list.push_back(elem);
return list;
}
Glavno pitanje se odnosi na overload operatora << ( koji sam pre sretao samo u kombinaciji sa ostream i istream ( >> ) objektima ).
Zanima me kako sada aplikacija zna da pozove ovaj operator za list objekat kada pozovem u kodu, npr data << 3;?
Da li je to priroda operatora << i da li unapred definisano da potpis funkcije mora biti strogo definisan na ovaj nacin da bi kompajler odredio koji je levi a koji desni operand operator <<?
Mozda je prosto objasnjenje ali trenutno ne mogu da shvatim kako ovo funkcionise (mozda mi je negde promaklo).
EOF