Puoi definire un alias di funzione (con un po' di lavoro) usando l'inoltro perfetto:
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
Questa soluzione si applica anche se f
è sovraccarico e/o un modello di funzione.
L'constexpr
il puntatore di funzione può essere utilizzato come alias di funzione.
namespace bar
{
int f();
}
constexpr auto g = bar::f;
È molto probabile (ma non garantito dal linguaggio) che l'utilizzo di g
utilizza bar::f
direttamente.In particolare, questo dipende dalla versione del compilatore e dal livello di ottimizzazione.
In particolare, questo è il caso di:
- GCC 4.7.1+, senza ottimizzazione,
- Clang 3.1+, senza ottimizzazione,
- MSVC 19.14+, con ottimizzazione.
Guarda l'assembly generato da questi compilatori.
Le classi sono tipi , quindi possono essere aliasati con typedef
e using
(in C++11).
Le funzioni sono molto più simili agli oggetti , quindi non c'è alcun meccanismo per crearne l'alias. Nella migliore delle ipotesi potresti usare puntatori a funzioni o riferimenti a funzioni:
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
Allo stesso modo, non c'è alcun meccanismo per aliasare le variabili (a corto di puntatori o riferimenti passanti).