Vous pouvez définir un alias de fonction (avec un peu de travail) en utilisant la redirection parfaite :
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
Cette solution s'applique même si f
est surchargé et/ou un modèle de fonction.
Le constexpr
le pointeur de fonction peut être utilisé comme alias de fonction.
namespace bar
{
int f();
}
constexpr auto g = bar::f;
Il est fort probable (mais non garanti par le langage) que l'utilisation de g
utilise bar::f
directement. Plus précisément, cela dépend de la version du compilateur et du niveau d'optimisation.
C'est notamment le cas pour :
- GCC 4.7.1+, sans optimisation,
- Clang 3.1+, sans optimisation,
- MSVC 19.14+, avec optimisation.
Voir l'assembly généré par ces compilateurs.
Les classes sont des types , afin qu'ils puissent être aliasés avec typedef
et using
(en C++11).
Les fonctions ressemblent beaucoup plus à des objets , il n'y a donc aucun mécanisme pour leur attribuer un alias. Au mieux, vous pouvez utiliser des pointeurs de fonction ou des références de fonction :
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
Dans le même esprit, il n'y a pas de mécanisme pour aliaser les variables (à court de pointeurs ou de références).