Ich versuche (und scheitere), eine Typeigenschaft zu schreiben, die Eigenausdrücke erkennt. Mit anderen Worten, ich möchte in der Lage sein, Dinge wie A * A + B
usw. zu erkennen, wobei A
und B
Eigen
Matrizen/Vektoren sind. Zur Zeit mache ich das:Schreiben eines Typenmerkmals zum Erkennen von Matrixausdrücken in Eigen
template<typename T>
struct is_matrix_expression : std::false_type
{
};
template<typename Derived> // specialization
struct is_matrix_expression<Eigen::MatrixBase<Derived>> :
std::true_type
{
};
Beachten Sie, dass Eigen::MatrixBase<Derived>
ist eine (Schablone) Basis für alle möglichen Eigen Ausdrücke (wie decltype(A * A + B)
usw.). Die allgemeine Vorlage wird jedoch ausgewählt, da sie besser für etwas wie decltype(A * A + B)
und nicht für die Spezialisierung MatrixBase<Derived>
geeignet ist.
Wie kann ich irgendwie die Spezialisierung erzwingen? Oder, mit anderen Worten, aktivieren Sie die Spezialisierung für alle möglichen Kinder von Eigen::MatrixBase<Derived>
? Ich habe ein wenig mit SFINAE unter std::is_base_of
gespielt, aber das erfordert einen expliziten Typ und keine Vorlage, bei der der Typ des Ausdrucks (in diesem Fall Derived
) nicht im Voraus bekannt ist. Wie kann ich erkennen, ob ein Typ X
ein Kind von Base<T>
ist, für einen Typ T
? Diese
Drop that 'typename'. Schreibst du 'typenname std :: template vector'? –
Ist [diese alte Antwort] (http://stackoverflow.com/a/12182195/27678) hilfreich? – AndyG
Ich denke, dein Problem ist, dass 'declltype (A * A + B)' nicht 'MatrixBase '... es wird wie' CwiseBinaryOp 'Recht sein? –
Barry