0xd34df00d 20.02.2013 06:07 Azoth_primary

В очередной раз бугурчу от отсутствия поддержки в плюсах биекц^W ковариантных типов и необходимости писать костыли вроде таких:
QList<QObject*> Buddy::GetAllMessages () const
{
QList<QObject*> result;
for (auto msg : Messages_)
result << msg;
return result;
}
где Messages_ — QList<ConvIMMessage*>, а class ConvIMMessage : public QObject.

1. amd63 20.02.2013 13:36 Azoth

А разве ConvIMMessage не есть IMessage? Всё равно ж потом qobject_cast<IMessage*> (msgObj) делаешь...
Или ты из-за Q_FOREACH (QObject *msgObj, e→GetAllMessages ()) теперь навсегда обречён всё сводить к QObject?
Как бы ты переписал этот Q_FOREACH если бы с++ полностью поддерживал сovariant return type // а разве нет? или ты про http://www.parashift.com/c++-faq-lite/ar... ?

2. amd63amd63 /1 20.02.2013 13:44 Azoth

И у тебя MessageType и MessageSubType не потомки IMessage, а enum-ы. В результате появляются switch (data ["MessageType"].toInt ()) и т.п.

3. 0xd34df00damd63 /2 20.02.2013 13:45 Azoth_primary

Это ты о чем ваще?

4. amd630xd34df00d /3 20.02.2013 13:46 Azoth

почему ты не сделал пачку потомков, зачем ты вместо этого сделал enum-ы?

5. 0xd34df00damd63 /1 20.02.2013 13:47 Azoth_primary

Есть. Да, делать. Зато QObject мне нужен, когда я хочу к сигналу подключиться.
Я бы его убрал нахуй. QList<U*> приводилось бы к QList<T*> во вменяемой системе типов.

6. 0xd34df00damd63 /4 20.02.2013 13:47 Azoth_primary

Потому что никакого особого функционала потомки эти не несут, нет смысла их делать и выносить свитч на уровень системы типов (которая в плюсах все равно говно и выглядит уебищно).

7. amd630xd34df00d /5 20.02.2013 15:36 Azoth

Я осознаю, что в плюсах QList<Base*> и QList<Derived*> are entirely unrelated types and you can't use an object of type QList<Base*> as if it were a QList<Derived*> и наоборот. Но я слышал о workaround-ах c множественным наследованием одним враппером другого, чтобы отношения Base-Derived между врапперами позволяли эмулировать "вменяемую систему типов" (причём вместо raw указателей U* и T* можно даже юзать умные с++11ые), только эти workaround-ы чота нинагугливаюццо. :(

Do you really want to delete ?