Was ist der beste Weg, eine Funktion in C ++ umzubenennen (Alias ​​/ Weiterleiten)?

(Ich werde diese Frage auf C ++ 11 beschränken, da ich glaube, dass es in C ++ 98 keine allgemeine Möglichkeit gibt, dies zu tun.)

Angenommen, ich habe einen komplizierten (in Bezug auf die Signatur) Satz vonVorlage Funktionen und / oder überladene Funktionen, und ich möchte diese Funktionen auf genau die gleiche Weise verwenden, aber mit einem anderen Namen (dh einem Alias).

Zum Beispiel:

template<class A, class B, class C> 
D fun(A a, B& b, C&& c){ ... }

template<class E, class F> 
G fun(H<E> he, F& f){ ... }

... many other versions of fun

Angenommen, ich möchteumbenennen (oderalias, odernach vorne um genauer zu sein, diese Funktionen auf einmal (d. h. in der Lage sein, einen anderen Namen für dieselbe Funktion zu verwenden, ohne ihn neu zu schreiben). So dass ich es in anderen Teilen des Codes mit einem anderen Namen und ohne Änderung des obigen Codes verwenden kann.

Ist das der richtige Weg zuumbenennen (alias / vorwärts)fun ingun?

template<typename... Args> 
inline auto gun(Args&&... args)->decltype(fun(std::forward<Args>(args)...)){
    return fun(std::forward<Args>(args)...);
}
Ist es wirklich allgemein?Ist das der einfachste Weg?Ist das der optimale Weg? (z. B. kann inliniert werden, keine unnötigen Kopien)Was wäre, wenn die ursprüngliche Funktion einige SFINAE-Funktionen hätte? (z.B.template<class A, class B, class C, class = std::enable_if< ... >::type>), werdendecltype die SFINAE in allen fällen übertragen?Was passiert, wenn die ursprüngliche Funktion Referenzen zurückgibt? Wird der Verweistyp nicht durch den Entschlüsseltyp entfernt? (z.B.double& fun(double& x){return x;}).Kann man dasselbe über Mitgliedsfunktionen sagen?

Klärung:gun wird es niemals seingenau fun, wie die Instanzen unterschiedliche Adressen haben, aber was ich suche, ist eine Umbenennung für den Gesichtspunkt der generischen Codierung.

Bemerkung: Ich finde es seltsam, dass fast alles umbenannt / weitergeleitet werden kann, Namespaces, Typen (typedef) und Vorlagentypenusing typedef, aber keine Funktionen (oder für diese Angelegenheit Mitgliedsfunktionen).

BEARBEITEN: Der Vollständigkeit halber habe ich hier ein Makro hinzugefügt, um Funktions-Aliase zu definieren:

#define ALIAS_FUNCTION(OriginalnamE, AliasnamE) \
template <typename... Args> \
inline auto AliasnamE(Args&&... args) -> decltype(OriginalnamE(std::forward<Args>(args)...)) { \
  return OriginalnamE(std::forward<Args>(args)...); \
}

und dann benutzt du es so:

namespace NS1{namepsace NS2{
  ALIAS_FUNCTION(NSA::fun, gun); // second argument (target name can't have namespace)
}}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage