Puede definir un alias de función (con algo de trabajo) utilizando el reenvío perfecto:
template <typename... Args>
auto g(Args&&... args) -> decltype(f(std::forward<Args>(args)...)) {
return f(std::forward<Args>(args)...);
}
Esta solución se aplica incluso si f
está sobrecargado y/o es una plantilla de función.
El constexpr
el puntero de función se puede usar como un alias de función.
namespace bar
{
int f();
}
constexpr auto g = bar::f;
Es muy probable (pero no está garantizado por el idioma) que usar g
usa bar::f
directamente. Específicamente, esto depende de la versión del compilador y el nivel de optimización.
En particular, este es el caso de:
- GCC 4.7.1+, sin optimización,
- Clang 3.1+, sin optimización,
- MSVC 19.14+, con optimización.
Ver ensamblado generado por estos compiladores.
Las clases son tipos , para que puedan tener un alias con typedef
y using
(en C++11).
Las funciones se parecen mucho más a objetos , por lo que no hay ningún mecanismo para crear un alias para ellos. En el mejor de los casos, podría usar punteros de función o referencias de función:
void (*g)() = &bar::f;
void (&h)() = bar::f;
g();
h();
Del mismo modo, no existe un mecanismo para crear alias en variables (abreviado de punteros directos o referencias).