2017-05-21 9 views
1

Ich mache eine Basisklasse und abgeleitete Klasse. Die abgeleitete Klasse enthält einen Wert von Eigen::Matrix<T,int,int> und erbt alle Methoden von Base.Klassenmitglied vom Typ Eigen :: MatrixBase <derived> in einer Klasse? Was ist "abgeleitet"?

Ich mache das so, dass die Methoden, die unabhängig vom Matrixtyp gleich sind, nicht alle wegen unterschiedlicher Matrizenargumente für Matrix wiederholt werden. Während diese Methoden in der Basisklasse auf einer MatrixBase ausgeführt werden können, kann ich keinen Typ von MatrixBase als Mitglied meiner Base-Klasse haben, da hierfür ein "abgeleiteter" Template-Arg benötigt wird.

Worauf bezieht sich "abgeleitet"?

Dokumentation sagt:

Abgeleitet ist der abgeleiteten Typ, beispielsweise ein Matrixtyp oder ein Ausdruck

Ich bin nicht sicher, was das bedeutet. Gibt es eine Instanz von "abgeleitet", die ich als Typ für MatrixBase ausfüllen kann?

+0

Ich verstehe nicht, was Sie hier eigentlich erreichen wollen. Wenn "Base" Zugriff auf die Matrix haben soll, machen Sie "Base" selbst zu einem Template und setzen Sie die Matrix dort ein. Aber zeigen Sie wahrscheinlich ein kurzes Beispiel dafür, was "Base" und was "Derived" in Ihrem Fall aussehen soll. – chtz

+1

Dies ist das Grundprinzip von CRTP (seltsam wiederkehrendes Template-Muster), das Eigen folgt, in dem "MatrixBase" eine abstrakte Klasse ist. Alle Eigenmatrizen und Ausdrücke erben davon, indem sie 'MatrixBase ' verwenden, wobei 'Derived' beispielsweise Ihre' Eigen :: Matrix 'oder ein Ausdruck sein könnte, der' Eigen :: Matrix 'beinhaltet. – romeric

+1

Sie haben gesagt, dass Sie keine MatrixBase als Mitglied Ihrer Basisklasse benötigen. Verwenden Sie einfach 'Matrix ' als Mitglied und machen Sie Ihre Basis-Klasse Funktionen Vorlagen, so dass sie akzeptieren 'const MatrixBase & 'als Eingabe-Argument. Dies funktioniert für jeden generischen Eigenausdruck, einschließlich Matrizen verschiedener Datentypen. – romeric

Antwort

1

Abhängig von Ihrer spezifischen Situation kann es eine gute Idee sein, ein Eigen Plugin zu erstellen anstatt eine neue Klasse zu erstellen. Eigener Plugins ermöglicht es Ihnen, neue Methoden zu vorhandenen (templateten) Eigenklassen hinzuzufügen, wie dokumentiert here. Die verschiedenen Makros, die Sie verwenden können, um dies zu erreichen, sind aufgeführt here.

Wie Chtz darauf hingewiesen, die Nachteil von Plugins ist, dass Sie riskieren inkompatibel mit Bibliotheken, die verschiedene Plugins verwenden.

+1

Ich rate normalerweise davon ab, Eigen-Plugins zu schreiben, es sei denn, es ist wirklich notwendig, weil Sie riskieren, mit Bibliotheken, die (verschiedene) Plugins verwenden, inkompatibel zu werden. Meistens gibt es einfachere Lösungen - aber ich habe noch keine Ahnung, was das OP hier eigentlich machen will. – chtz

Verwandte Themen