Ich versuche, einige Funktionen mit Template-Spezialisierung für Eigen-Typen zu schreiben, im Anschluss an diese Frage: Eigen: type deduction in template specialization of base-classVorlage Spezialisierung Funktion mit Eigen Argumente
ich dies schrieb:
#include <type_traits>
#include <Eigen/Core>
namespace isEigenPlainObjectBaseDetail {
template <typename T>
std::true_type test(const Eigen::PlainObjectBase<T>);
std::false_type test(...);
}
template <typename T>
struct isEigenPlainObjectBase :
public decltype(isEigenPlainObjectBaseDetail::test(std::declval<T>())) {};
template <typename T, typename Enable = void>
void foo(T& obj) {
std::cout << "Generic Called!\n";
}
template <typename T, typename std::enable_if<isEigenPlainObjectBase<T>::value>::type>
void foo(T& obj) {
std::cout << "Eigen Specialization Called!";
}
int main() {
Eigen::MatrixXd m;
Eigen::VectorXd v;
int i = 0;
foo(i);
foo(m);
foo(v);
return 0;
}
aber dies erfordert jedes Mal die generische Funktion :
Generic Called!
Generic Called!
Generic Called!
Was mache ich falsch? Wie kann ich Template-Spezialisierungen für Funktionen mit Eigenmatrizen und Vektoren schreiben?
Ich denke, dass die zweite Funktion eine Überladung ist, die gültig ist, weil der zweite Vorlagenparameter ein Nicht-Typ ist. Es wird jedoch immer SFINAE ausgegeben, weil 'std :: enable_if <> :: type' 'void' ist, was nicht erlaubt ist. – Quentin
@Quentin - Ich habe nicht bemerkt, war nicht 'typename = typenname std :: enable_if' sondern nur' typenname std :: enable_if'; Antwort modifiziert um dies explizit zu machen; Vielen Dank! – max66
ok, gut zu wissen! : D Ich habe es mit gcc kompiliert, habe es nicht mit msvc versucht. aber natürlich hat es nicht funktioniert! Ich hatte gehofft, in etwas in der Eigen-Bibliothek entworfen, die erlaubt, alle Eigenebenen Objektbasis mit Vorlagen zu diskriminieren! –