J'ai donc de nouveau rencontré les limites de QObject
s qui ne peuvent pas être mélangées avec des modèles (du moins pas directement). Fondamentalement, j'ai une classe de modèle de proxy qui utilise l'indexation pour traduire les positions de la source à des positions locales et inversement. L'index peut être implémenté de plusieurs façons, pour l'instant j'ai besoin de deux versions, l'une utilisant QHash
et l'autre utilisant QVector
. L'interface de l'index est commune aux deux avec seulement des différences subtiles concernant la manipulation d'index. Avec des modèles, ce serait facile, je ferais de la classe un modèle, puis j'utiliserais la spécialisation pour ces deux cas.Alternatives à l'implémentation d'index virtuel dans un modèle
Cependant, le modèle doit être un QObject
donc plutôt il semble que je aurais besoin d'utiliser le polymorphisme comme ceci:
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;
};
J'ai quelques problèmes avec cela. D'abord, il faut une allocation dynamique de l'indice dont je voudrais me débarrasser. Deuxièmement, en raison de l'utilisation de pointeur IndexInterace
pour envoyer les appels à l'index aucune méthode de l'index ne sera jamais en ligne (j'ai examiné le code démonté pour confirmer cela et essayé diverses optimisations, etc. en vain).
Quelles seraient les alternatives à cette conception idéalement sans allocation dynamique de l'indice et sans appels virtuels à l'index?
Assurez-vous d'inclure la macro 'Q_OBJECT' dans les définitions de classe' VectorIndexProxy' et 'HashIndexProxy' dans le premier exemple. –
@JonHarper C'est ce qui est implicite dans le '...' :) Sinon, c'est une pente glissante et la prochaine chose que quelqu'un d'autre me dira est que l'implémentation complète et correcte d'un modèle lui appartient :) –
Bon point. :-) –