auf von this question, which asks about SFINAE Nach es das Beispiel gibt:SFINAE verwenden, wie man vermeiden ‚hat keinen Namen Mitglied ...‘
template<class T>
std::string optionalToString(T* obj)
{
if (FUNCTION_EXISTS(T->toString))
return obj->toString();
else
return "toString not defined";
}
Wenn jedoch ein Objekt nicht zum Beispiel eine toString() -Funktion, anstelle dieser Fall "toString nicht definiert" zurückgegeben, auch wenn wir erkennen können, ob die Funktion existiert, wird der Compiler immer noch einen Fehler, dass Objekt hat kein Element mit dem Namen "toString", vor dem Hervorheben des Zeigers toString Aufruf .
ich die gleichen Operationen auf Objekten in der Lage sein möchten, dass zu tun, die aus C++ Bibliotheken kommen, die unterschiedliche Namenskonventionen haben, zum Beispiel:
if(R_Contains_SetPosition<TemplateObject>::Value)
{
TemplateObject->SetPosition(X,Y);
}
else if(R_Contains_setPosition<TemplateObject>::Value)
{
TemplateObject->setPosition(X,Y); //TemplateObject doesn't have a setPosition defined!
}
Welche kann der Code bereits tun, aber der Compiler wirft ein Fehler bei allen Anweisungen, die Funktionen aufrufen, die das Objekt nicht definiert hat.
Gibt es eine Möglichkeit, den Compiler Code akzeptieren (entweder durch erneutes Schreiben oder Ändern von Compiler-Flags, vorzugsweise erstere), die eine Memberfunktion aufrufen kann (die in diesem Fall nicht ausgeführt wird trotzdem), auch wenn der Compiler weiß, dass die Member-Funktion nicht existiert?
Klarstellung:
Dies ist nicht die Frage, wie eine Funktion existiert zu erkennen. Ich habe diese Fähigkeit bereits., es fragt, wie kann ich Code schreiben, der sich auf Funktionen bezieht, die ein Objekt nicht unbedingt haben muss, ohne dass sich der Compiler darüber beschwert?
Das System ist C++ 03, daher sind experimentelle C++ 14-ähnliche Lösungen hier nicht gültig.
Nein. Der gesamte Code in der Funktion wird instanziiert und muss für den angegebenen Typ gültig sein.Sie müssen sfinae und specialization verwenden, um Funktionen zu erstellen, die immer mit allen Typen funktionieren, die sie erhalten. boost :: hana hat Code, der das einfacher macht und mehr wie das aussieht, was Sie vorschlagen, aber es ist syntaktischer Zucker über sfinae. – xaxxon
Er ... Inwiefern ist das nicht ein vollständiges Duplikat der Frage, die Sie mit sich selbst verknüpfen? Hast du die Antworten gelesen, bevor du diese Frage gestellt hast? Ich bin versucht, das zu beenden, aber ich gebe dir die Chance, zu antworten, falls mir etwas fehlt. – hvd
Weil doing -> toString, sogar mit den vorgeschlagenen Funktionsprüfern, einen Fehler auslöst, dass die Elementfunktion nicht existiert. Ich frage nicht "Wie überprüfe ich, ob eine Funktion existiert", frage ich, "wie täusche ich den Compiler, mich nicht über die Nichtexistenz einer Funktion abzutun". – c1646091