1

Gibt es eine Möglichkeit, Funktionsüberladung zu vermeiden und eine generischere Funktion mithilfe der Vorlage zu schreiben? Derzeit sieht mein Code wie folgt aus:Eine generische Funktion, die Vorlagen mit unterschiedlichen Eingabeargumenten und unterschiedlichen Rückgabetypen verwendet

placement Detect::predict(Eigen::Array<double, rowSize, 1> &feature) 

und

position Detect::predict(std::unordered_map<std::string, std::vector<double>> &feature) 

Im obigen placement und position sind ENUMS von mit verschiedenen Kategorien.

Wie kann ich dies mit template schreiben?

+1

IMO gibt es keine Möglichkeit, die Vorlage in Ihren Funktionen zu verwenden. – FieryCod

+0

Ok. Um mein Verständnis zu klären, sollten die Eingabeargumente und der Rückgabetyp identisch sein, um Vorlagen zu verwenden. –

+1

Nein, die Argument- und Rückgabetypen müssen nicht mit dem Template-Argument identisch sein, aber es gibt einfach keine einfache oder elegante Möglichkeit, eine einzelne Funktion zu erstellen, die beide Fälle behandeln kann, welcher der Typen (return oder argument) sein sollte gestempelt? Der eine oder der andere oder beides? Wie würden Sie zwischen den Implementierungen unterscheiden? Überladen ist der beste Weg hier, wie ich es sehe, wenn Code zwischen den beiden Funktionen gemeinsam ist, setzen Sie diesen allgemeinen Code in eine dritte Funktion, die Sie stattdessen aufrufen können. –

Antwort

1

Leider kann man, ausgehend von dem von Ihnen geposteten Code, keine Lösung anbieten, die dieselben Klassen und Namen verwendet.
Wie auch immer, vielleicht können Sie tun, was Sie versuchen, indem Sie sich auf sfinae Ausdrücke verlassen.

Als Beispiel:

#include<type_traits> 

template<typename T> 
constexpr 
std::enable_if_t<std::is_same<T, int>::value, char> 
func(T) { return 'c'; } 

template<typename T> 
constexpr 
std::enable_if_t<not std::is_same<T, int>::value, int> 
func(T) { return 42; } 

int main() { 
    static_assert(func(42) == 'c', "!"); 
    static_assert(func(.0) == 42, "!"); 
} 

In dem obigen Beispiel gibt eine funcchar, wenn der Typ des Arguments int ist, sonst ist es ein int zurückgibt.
Sie müssen einfach die Typen und die Ausdrücke für sfinae entsprechend Ihren Anforderungen anpassen.

Hinweis

Ich sage nicht, dass die OP nicht mit Überlastung gehen. Stattdessen denke ich, dass es in diesem Fall besser wäre.
Diese Antwort versucht nur zu zeigen, wie das OP das Ziel mithilfe von Vorlagen erreichen kann.

+0

Danke. Lass mich sehen, ob ich meinen Code entsprechend modifizieren kann. –

+0

Downwoters: zumindest ein Kommentar würde helfen zu wissen, wofür der Downvote ist. Vielen Dank. – skypjack

0

Ja, Sie können es tun. Ich nehme an, dass Sie Ihre Erkennungsfunktion mit dem Container als Typ übergeben möchten.

Sie müssen den gewünschten Rückgabetyp mit dem Containertyp verknüpfen. Wenn es keine feste Beziehung gibt, können Sie das Typ-Trapez-Konzept verwenden (ich meine nicht den Typ-Trapez-Header in einer anderen Antwort).

Grundsätzlich erstellen Sie eine neue Template-Klasse, die eine Typedef- oder Using-Anweisung enthält Wird als Rückgabetyp für die Erkennungsfunktion verwendet. Diese Rückgabetypen können die Enumeration umbrechen.

Sie spezialisieren sich diese Eigenschaft Klasse für jeden der Containertypen Sie verwenden müssen jetzt

Leider (können Template-Template-Parameter hier verwenden müssen) ich nicht Beispiel geben kann, sondern Antwort zu aktualisieren, wenn ich mehr haben Zeit und eine richtige Tastatur, wenn Sie mehr brauchen.

+0

Danke Rox. Gegenwärtig gibt es keine feste Beziehung. Ich würde mich freuen, wenn Sie mir bitte ein Beispiel geben könnten. –

Verwandte Themen