also, nur ob ich es recht verstehe:
Code: Alles auswählen
template <typename Base>
class BaseItem : public Base
{
///
};
class StartItem : public BaseItem<QGraphicsEllipseItem>
{
///
};
Der qgraphicsitem_cast schaut so aus:
Code: Alles auswählen
template <class T> inline T qgraphicsitem_cast(QGraphicsItem *item)
{
return int(static_cast<T>(0)->Type) == int(QGraphicsItem::Type)
|| (item && int(static_cast<T>(0)->Type) == item->type()) ? static_cast<T>(item) : 0;
}
Ist also ein "leichter Wrapper um static_cast". dynamic_cast ist ja recht langsam.
Die einzige Lösung, die mir einfällt, ist mit den types rumzuspielen

Z.B.:
Code: Alles auswählen
class StartItem : public BaseItem<QGraphicsEllipseItem>
{
public:
enum { Type = QGraphicsItem::UserType + 1 }
int type() const { return Type; }
};
class EndtItem : public BaseItem<QGraphicsEllipseItem>
{
public:
enum { Type = QGraphicsItem::UserType + 2 }
int type() const { return Type; }
};
Um das zu vereinfachen, wäre es auch sicher schön, den type schon in BaseItem zu verarbeiten:
Code: Alles auswählen
template <typename Base, int UserTypeOffset>
class BaseItem
{
public:
enum { Type = QGraphicsItem::UserType + UserTypeOffset };
int type() const { return Type };
};
class StartItem : public BaseItem<QGraphicsEllipseItem, 1>
{};
Ist aber ungetestet
// edit:
Juppidu, funktioniert
Code: Alles auswählen
#include <QtGui>
#include <QDebug>
template <typename Base, const int UserTypeOffset>
class BaseItem : public Base
{
public:
enum { Type = QGraphicsItem::UserType + UserTypeOffset };
int type() const { return Type; }
};
class StartItem : public BaseItem<QGraphicsEllipseItem, 1>
{};
class EndItem : public BaseItem<QGraphicsEllipseItem, 2>
{};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QGraphicsItem *si = new StartItem;
QGraphicsItem *ei = new EndItem;
qDebug() << qgraphicsitem_cast<EndItem*>(ei);
qDebug() << qgraphicsitem_cast<EndItem*>(si);
qDebug() << qgraphicsitem_cast<StartItem*>(ei);
qDebug() << qgraphicsitem_cast<StartItem*>(si);
}