Hier ist eine Funktion, die ich schreiben möchte: Ich foo
in einem Typ-Parameter nennen möchte in der Lage seinMit Ref <> für generische Eigen-Matrizen in einer Templat-Funktion
template<typename NumType> using Vec = Eigen::Matrix<NumType, Eigen::Dynamic, 1>;
template<typename T>
void foo(Eigen::Ref<Vec<T>> p)
{
// fill p with things
}
void main()
{
Vec<double> v(2);
foo(v)
}
insbesondere ohne Durch die Vorlage, aber stattdessen haben die Funktion den Typ durch das Argument abzuleiten. Wenn ich diesen Code ausführen bekomme ich die Fehlermeldung, dass
No matching function call to 'foo'
Candidate template ignored: could not match 'Ref' against 'Matrix'
fein Diese Funktion funktioniert, wenn ich in der Art zu den Funktionsaufruf übergeben, wie foo<double>(v)
. Ich weiß, auch die Art T
geschlossen werden kann, wenn die Signatur von foo
template<typename T>
void foo(Vec<T> & p)
ist, aber das ist nicht ein guter Weg, vorbei Eigenvektoren durch Verweis als es die Vorteile der Ausdrucksvorlagen zerstört.
Ich kann auch nicht die MatrixBase
Methode des Führens durch Referenz verwenden
template<typename Derived>
void foo(Eigen::MatrixBase<Derived>& p)
, weil ich der Vektor übergeben wird in der Art ist sicher sein will T
, und ich weiß nicht, wie das zu gewährleisten, mit diese Methode.
Gibt es eine Möglichkeit, Ref<>
in einer Template-Funktion wie dieser zu verwenden, wo es auf den Typ T
schließen? Alle Hilfe wird geschätzt.
Vielen Dank für Ihre Antwort. Ich habe derzeit ein Workaround, das ist "Vorlage void foo (MatrixBase >)", aber dies funktioniert nicht, wenn ich in einem Vektor fester Größe übergeben. Können Sie erklären, warum ein Vektor mit fester Größe nicht in einen dynamisch großen Vektor konvertiert werden kann? Ich versuche meistens nur zu verstehen, wie alles funktioniert, aber ich mag auch diese Methode, weil es meinem Benutzer nicht erlaubt, eine Matrix zu übergeben, wenn ich einen Vektor haben möchte. Ich kann natürlich überprüfen, ob der Parameter ein Vektor ist, aber das scheint eleganter zu sein. –
jbcolli2