Beste Alternative zu einem typedef für eine Funktionsvorlage?
Was ich tun möchte ist etwas wie dieses:
template <class DataType>
DataType myFunc(DataType in)
{
...
}
typedef myFunc<int> myFunc_i;
myFunc_i(37);
...aber typedefs können nicht verwendet werden für Funktionen wie in C++. Was ich Frage mich... was sind Leute, die bevorzugte Wahl in diesem Fall? Die einzigen, die ich denken kann, sind:
1) Nur mit Ihr umgehen, und verwenden Sie immer myFunc syntax
2) erstellen Sie Manuell eine wrapper-Funktion, dh
inline int myFunc_i(int in)
{
return myFunc<int>(in);
}
Das würde funktionieren, hätte aber den Nachteil, dass zusätzliche Wartung, und die Möglichkeit, dass Sie würde get out of sync (dh, wenn Sie ändern Sie die Funktion Unterschrift für myFunc).
Gedanken?
Kommentar zu dem Problem
Ich verstehe nicht, warum nicht einfach rufen Sie die Spezialisierung direkt
myFunc(37);
? InformationsquelleAutor der Frage Paul Molodowitch | 2011-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
decltype
:InformationsquelleAutor der Antwort jtooker
Versuchen Sie dies:
Dies löst einen compiler-Fehler, wenn die Signatur
myFunc
jemals ändert. Macht esconst
verbietet auch neu zuweisen. Funktion Zeiger sind ebenfalls aufrufbar wie eine normale Funktion:myFunc_i(5)
.Wenn Sie nicht möchten, dass ein compiler-Fehler, sondern haben es selbst aktualisieren, verwenden Sie
auto
(wieder mitconst
):InformationsquelleAutor der Antwort Xeo
Einige können nicht einverstanden, einige können Ruck Ihre Knie vor diesem, aber Bedenken Sie diese option:
Soweit Makros gehen, dieser ist ziemlich sicher; die einzige Gefahr ist, dass jemand könnte neu definieren oder löschen Sie es später.
Abgesehen davon, dass, es hat alle Vorteile
auto const myFunc = myFunc<int>;
. Wenn Sie möchtenauto
wollen aber nicht mit dem C++0x-features-doch dies ist ein portabler Weg, um den gleichen Effekt erzielen.InformationsquelleAutor der Antwort Chris Lutz
Code Beispiel:
Drucke 9, das bedeutet, dass die int-Funktion verwendet
auto
erfordert c++0x, können Sie verwenden echte typename statt, aber Sie ist hässlich und Sie müssen überprüfen, ändern der Signatur zu.Neben dieser code kann nicht zulassen, Ihre compiler inline diese Funktion
Als für mich, es ist oft besser, verwenden Sie vollständige Namen mit
<>
In Ihrem Fall müssen Sie nicht verwenden
<>
weilmyFunc
ist genug(DataType
kann vom argument-Typ)InformationsquelleAutor der Antwort RiaD
Ich würde eine kleine Verbesserung gegenüber Xeo Antwort.
Anstelle von:
Ich würde
InformationsquelleAutor der Antwort purpletentacle