четверг, 1 октября 2009 г.

Qt: QList и перегруженный API контейнера

Кусок кода из Qt 4.5 :

inline const T &QList<T>::at(int i) const

{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::at", "index out of range");

return reinterpret_cast<Node *>(p.at(i))->t(); }

inline const T &QList<T>::operator[](int i) const

{ Q_ASSERT_X(i >= 0 && i < p.size(), "QList<T>::operator[]", "index out of range");

return reinterpret_cast<Node *>(p.at(i))->t(); }


сложно найти 10 отличий?

вначале удивило одинаковое описание оператора [] и функции at в доке на Qt.Возникло подозрение что как и в STL они могут различаться поведением при невалидном входном параметре, а все оказалось проще, разницы никакой(если не считать имени, то это банальный копипейст), сделано явно с желанием угодить всем, независемо от любимого способа доставать элементы из контейнера. Подход достаточно спорный, для меня он скорей запутывающий чем удобный.

2 комментария:

Roman комментирует...

Блин фигня какая. А чего не заюзать ат(і) в перегруженном операторе или наоборот?

Там инлайн оверхеда - 0. А так только копии кода плодят - ето ламерство а не спорный подход как по мне.

Толік комментирует...

не совсем ламерство, если вставить вызво, то нету 100% гарантии что компилятор сделает его инлайновым, а спорный подход это попытка сделать эти контейнеры максимально совместимыми с СТЛ, при этом предоставляя в дополнение к нему еще и итераторы в джава стиле, а вот стлных алгоритмов нету :(