0xd34df00d
31.05.2011 09:09 Azoth_primary
Добавлять говны в такой контейнер еще круче:
AwaitingPacketCallbacks_ [packet.to ()] [packet.id ()] = QPair<QPointer<QObject>, QByteArray> (obj, method);
у Страуструпа написано, как поступать в таких случаях, когда надо выводить тип объекта по его конструктору.
тут по всем законам жанра нужно чтобы существовал некий qmake_pair, чтобы вместо QPair<QPointer<QObject>, QByteArray> (obj, method); писать qmake_pair(obj, method)
http://doc.qt.nokia.com/latest/qpair.htm...
qMakePair называется
Да, но у obj тип QObject*, поэтому автоматический вывод не сработает, поэтому придется, например, оборачивать obj в QPointer<QObject> явно.
Впрочем, я сделал
typedef QPair<QPointer<QObject>, QByteArray> PacketCallback_t;
typedef QHash<QString, PacketCallback_t> PacketID2Callback_t;
QHash<QString, PacketID2Callback_t> AwaitingPacketCallbacks_;
и теперь просто делаю
... = PacketCallback_t (obj, method);
если бы у QPair было присваивание с приведением, как у бустовских кортежей например, то все-равно сработало бы, за исключением того, что ты поимел бы целый лишний временный объект в рантайме. непонятно зачем в данном случае. так что, я думаю, Онотоле одобрил бы эти typedef'ы.
Что ты имеешь ввиду под присваиванием с приведением?
примерно это:
template<class U1, class U2> operator= (const pair<U1,U2>& other_pair ){
/*типа T1*/ first = other_pair.first;
/*типа T2*/ second = other_pair.second;
}
А, ок, согласен.