C 11: Funktions-Aliasing
In C kann das Schlüsselwort using verwendet werden, um einen Alias für eine Klasse zu erstellen. Allerdings ist die gleiche Funktionalität für Funktionen nicht direkt verfügbar. Dieser Artikel geht der Frage nach, ob Funktionsaliasing möglich ist, und bietet eine Lösung mithilfe von Perfect Forwarding.
Ziel:
Feststellen, ob es möglich ist, ein Alias für eine Funktion zu erstellen C und, wenn ja, die sauberste Methode zu finden, um dies zu erreichen.
Problemstellung:
Bedenken Sie Folgendes Code:
namespace bar
{
void f();
}
Wir möchten einen Alias namens g für die Funktion bar::f erstellen. Der folgende Versuch führt jedoch zu einem Fehler:
using g = bar::f; // error: ‘f’ in namespace ‘bar’ does not name a type
Lösung:
Um einen Funktionsalias zu erstellen, können wir eine Kombination aus Vorlagen und perfekter Weiterleitung verwenden . Hier ist ein Beispiel, wie dies erreicht werden kann:
template
auto g(Args&&... args) -> decltype(f(std::forward(args)...)) {
return f(std::forward(args)...);
}
Diese Lösung funktioniert durch die Erstellung einer generischen Vorlagenfunktion, die eine beliebige Anzahl von Argumenten akzeptiert. Anschließend werden diese Argumente mittels Perfect Forwarding an die ursprüngliche Funktion f weitergeleitet. Dadurch wird sichergestellt, dass die aufgerufene Funktion die Argumente in ihrer ursprünglichen Form erhält, unabhängig von Typkonvertierungen oder Zeiger-Dereferenzierungen, die möglicherweise auf den Alias angewendet wurden.
Hinweis:
Diese Lösung Funktioniert auch für überladene Funktionen und Funktionsvorlagen und stellt sicher, dass die richtige Funktion basierend auf den bereitgestellten Argumenten aufgerufen wird.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3