So habe ich wieder die Grenzen von QObject
s, die nicht mit Vorlagen gemischt werden können (zumindest nicht direkt). Grundsätzlich habe ich eine Proxy-Modell-Klasse, die Indexierung verwendet, um die Quellpositionen zu lokalen Positionen und zurück zu übersetzen. Der Index kann auf verschiedene Arten implementiert werden, für den Moment brauche ich zwei Versionen, eine mit QHash
und eine mit QVector
. Die Schnittstelle des Index ist beiden gemeinsam, mit nur geringen Unterschieden bezüglich der Indexmanipulation. Mit Vorlagen wäre das einfach, ich würde die Klasse zu einer Vorlage machen und dann Spezialisierung für diese beiden Fälle verwenden.Alternativen zur virtuellen Indeximplementierung in einem Modell
jedoch das Modell ein QObject
sein muss, so scheint es, stattdessen würde ich Polymorphismus wie so verwenden müssen:
class IndexInterface;
class VectorIndex; //inherits IndexInterface
class HashIndex; //inherits IndexInterface
class ProxyModel : public QObject
{
Q_OBJECT
public:
enum IndexType { Vector, Hash };
explicit ProxyModel(IndexType indexType, QObject *parent = 0) :
QObject(parent),
index(indexType == Vector ? new VectorIndex : new HashIndex)
{
}
//...
private:
IndexInterface *index = nullptr;
};
Ich habe einige Probleme mit diesem. Erstens erfordert es eine dynamische Zuordnung des Index, die ich gerne loswerden möchte. Zweitens, wegen der Verwendung von Zeiger auf IndexInterace
, um die Aufrufe an den Index zu versenden, wird keine Methode des Index jemals inline sein (ich habe über disasasemed Code nachgedacht, um dies zu bestätigen und verschiedene Optimierungen usw. vergeblich versucht).
Was wären die Alternativen zu diesem Design im Idealfall ohne dynamische Zuordnung des Index und ohne virtuelle Aufrufe an den Index?
Stellen Sie sicher, dass das Makro 'Q_OBJECT' in den Klassendefinitionen' VectorIndexProxy' und 'HashIndexProxy' im ersten Beispiel enthalten ist. –
@JonHarper Das ist was im '...' :) impliziert. Sonst ist es ein rutschiger Abhang und das nächste, was jemand anderes mir sagen wird ist, dass die gesamte, korrekte Implementierung eines Modells da hingehört :) –
Guter Punkt. :-) –