Es ist einfach, einen neuen Namen für einen Typ, eine Variable oder einen Namespace zu erstellen. Aber wie ordne ich einer Funktion einen neuen Namen zu? Zum Beispiel möchte ich den Namen holler
für verwenden printf
. #define ist offensichtlich ... auf andere Weise?
Lösungen:
#define holler printf
void (*p)() = fn; //function pointer
void (&r)() = fn; //function reference
inline void g(){ f(); }
void (&NewName)(some_vector&, float, float, float, float) = OldName;
bei meinem nächsten Check-in zu sehen.printf
hier nicht mit . Das war nur ein Beispiel. Das Problem hier hat mehr mit Einschränkungen des Englischen als mit irgendetwas anderem zu tun. Ich habe eine einzige Funktion, die Zweck A und Zweck B erfüllt, aber ich kann hier einfach keinen einzigen Namen finden, der beiden Zwecken dient.T &a = b;
erstellt einen neuen Namen fürb
.typedef
für Typen undnamespace A=B;
für Namespaces.using BaseClass::BaseClassMethod
und es gibtusing AliasType = Type;
und es gibt sogarnamespace AliasNamespace = Namespace;
. Was wir vermissen istusing AliasFunction = Function;
Antworten:
Es gibt verschiedene Ansätze:
Mit C ++ 11 mit nicht vorlagenübergreifenden Funktionen können Sie einfach Folgendes verwenden:
Wenn diese Funktion mehrere Überladungen aufweist, sollten Sie Folgendes verwenden
static_cast
:Beispiel: Es gibt zwei Funktionsüberladungen
std::stoi
Wenn Sie einen Alias für die erste Version erstellen möchten, sollten Sie Folgendes verwenden:
Hinweis: Es gibt keine Möglichkeit, einen Alias für überladene Funktionen so zu erstellen, dass alle überladenen Versionen funktionieren. Sie sollten daher immer genau angeben, welche Funktionsüberladung Sie möchten.
Mit C ++ 14 können Sie mit
constexpr
Vorlagenvariablen noch weiter gehen . Damit können Sie Vorlagenfunktionen als Alias verwenden:Darüber hinaus haben Sie ab C ++ 11 eine Funktion namens
std::mem_fn
, die es ermöglicht, Mitgliedsfunktionen zu aliasen. Siehe folgendes Beispiel:quelle
constexpr
Ansatz der Vorlagenvariablen zu geben: Der Alias kann keinen Typabzug durchführen. Der Compiler verlangt von mir die Bereitstellung einer Vorlagenparameterliste (ich schreibe eine variable Vorlagenfunktion): Ich kann ohne eine Vorlagenargumentliste nicht auf die Variablenvorlage "alias_to_old" verweisenconstexpr auto new_fn_name = old_fn_name
funktioniert in C ++ 11 (zumindest in gcc 4.9.2) und ist besser als das Platzieren&
. Der Aufruf muss nicht immer über den Zeiger erfolgen, sodass die Funktion anstelle des Aufrufs eingefügt werden kann.constexpr auto holler = [] ( auto &&...args ) { return printf( std::forward<decltype(args)>( args )... ); };
std::mem_fn
ist kein Alias, da es viel mehr Magie hinter dem Sinn ausübt.Sie können einen Funktionszeiger oder eine Funktionsreferenz erstellen:
quelle
fn
mit dem Alias anrufen ? Können Sie den Funktionszeiger und die Funktionsreferenz erklären? Wie unterscheiden sie sich? Sind sie hier gleich?r();
void (&r)() = this->fn;
Sollte es dir gut gehen.
quelle
decltype
wie es in c ++ 11 eingeführt wurde. Darüber hinaus sollte dies auch mit der guten alten Ebene Cint (*holler)(const char*, ...) = std::printf;
quelle
Verwenden Sie einen Inline-Wrapper. Sie erhalten beide APIs, behalten jedoch die einzelne Implementierung bei.
quelle
Von fluentcpp : ALIAS_TEMPLATE_FUNCTION (f, g)
quelle
Es ist erwähnenswert, dass IMO zwar die ursprüngliche Frage (und gute Antworten) auf jeden Fall nützlich sind, wenn Sie eine Funktion umbenennen möchten (es gibt gute Gründe dafür!), Wenn Sie jedoch nur einen tiefen Namespace entfernen möchten, aber Behalte den Namen, dafür gibt es das
using
Schlüsselwort:Dies hat auch den Vorteil, dass es auf einen Bereich beschränkt ist, obwohl Sie es immer auf der obersten Ebene einer Datei verwenden können. Ich benutze dies oft für
cout
undendl
deshalb muss ich nicht ALLESstd
mit dem Klassikerusing namespace std;
oben in einer Datei einfügen, aber auch nützlich, wenn Sie so etwas wiestd::this_thread::sleep_for()
viel in einer Datei oder Funktion verwenden, aber nicht überall und keine anderen Funktionen aus dem Namespace. Wie immer wird davon abgeraten, es in .h-Dateien zu verwenden, da sonst der globale Namespace verschmutzt wird.Dies ist nicht dasselbe wie das obige "Umbenennen", aber es ist oft das, was wirklich gewünscht wird.
quelle
Mit generischen C ++ 14-Lambdas konnte ich Folgendes tun, was auch funktionieren sollte, wenn die Zielfunktion mehrere Überladungen aufweist:
quelle