Sie können einen Funktionsalias (mit etwas Arbeit) mit perfekter Weiterleitung definieren:
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
Diese Lösung gilt auch, wenn f
ist überladen und/oder eine Funktionsvorlage.
Die constexpr
Funktionszeiger kann als Funktionsalias verwendet werden.
namespace bar
{
int f();
}
constexpr auto g = bar::f;
Es ist sehr wahrscheinlich (aber nicht durch die Sprache garantiert), dass die Verwendung von g
verwendet bar::f
direkt. Konkret hängt dies von der Compilerversion und dem Optimierungsgrad ab.
Dies gilt insbesondere für:
- GCC 4.7.1+, ohne Optimierung,
- Clang 3.1+, ohne Optimierung,
- MSVC 19.14+, mit Optimierung.
Siehe Assembly, die von diesen Compilern generiert wird.
Klassen sind Typen , sodass sie mit typedef
aliasiert werden können und using
(in C++11).
Funktionen sind viel mehr wie Objekte , also gibt es keinen Mechanismus, um sie zu aliasieren. Bestenfalls können Sie Funktionszeiger oder Funktionsreferenzen verwenden:
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
Ebenso gibt es keinen Mechanismus zum Aliasing von Variablen (kurz für Durchgangszeiger oder Referenzen).