
agnel kurian
Es fácil crear un nuevo nombre para un tipo, una variable o un espacio de nombres. Pero, ¿cómo asigno un nuevo nombre a una función? Por ejemplo, quiero usar el nombre holler
por printf
. #define es obvio… ¿de alguna otra manera?
Soluciones:
#define holler printf
void (*p)() = fn; //function pointer
void (&r)() = fn; //function reference
inline void g(){ f(); }

sasha.sochka
Hay diferentes enfoques:
-
Con C++ 11 con funciones no sobrecargadas sin plantilla, simplemente puede usar:
const auto& new_fn_name = old_fn_name;
-
Si esta función tiene múltiples sobrecargas, debe usar static_cast
:
const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);
Ejemplo: hay dos sobrecargas de función std::stoi
int stoi (const string&, size_t*, int);
int stoi (const wstring&, size_t*, int);
Si desea hacer un alias a la primera versión, debe usar lo siguiente:
const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);
Nota: no hay forma de crear un alias para la función sobrecargada de modo que todas sus versiones sobrecargadas funcionen, por lo que siempre debe especificar qué función exacta desea sobrecargar.
-
Con C++14 puedes ir aún más lejos con constexpr
variables de plantilla. Eso le permite crear alias de funciones con plantilla:
template<typename T>
constexpr void old_function(/* args */);
template<typename T>
constexpr auto alias_to_old = old_function<T>;
-
Además, comenzando con C++ 11 tienes una función llamada std::mem_fn
que permite crear alias de funciones miembro. Vea el siguiente ejemplo:
struct A {
void f(int i) {
std::cout << "Argument: " << i << '\n';
}
};
A a;
auto greet = std::mem_fn(&A::f); // alias to member function
// prints "Argument: 5"
greet(a, 5); // you should provide an object each time you use this alias
// if you want to bind an object permanently use `std::bind`
greet_a = std::bind(greet, a, std::placeholders::_1);
greet_a(3); // equivalent to greet(a, 3) => a.f(3);
Puede crear un puntero de función o una referencia de función:
void fn()
{
}
//...
void (*p)() = fn;//function pointer
void (&r)() = fn;//function reference
typedef int (*printf_alias)(const char*, ...);
printf_alias holler = std::printf;
Debería hacerte bien.
int (*holler)(const char*, ...) = std::printf;
Utilice una envoltura en línea. Obtiene ambas API, pero mantiene la implementación única.

pez vela009
Desde fluentcpp : ALIAS_TEMPLATE_FUNCTION(f, g)
#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \
template<typename... Args> \
inline auto highLevelF(Args&&... args) -> decltype(lowLevelF(std::forward<Args>(args)...)) \
{ \
return lowLevelF(std::forward<Args>(args)...); \
}

salón antonio
Con las lambdas genéricas de C++14, pude hacer lo siguiente, que también debería funcionar cuando la función de destino tiene múltiples sobrecargas:
constexpr auto holler = [] ( auto &&...args ) {
return printf( std::forward<decltype(args)>( args )... );
};
Gracias a todos ustedes. A mis colegas les encantará ver
void (&NewName)(some_vector&, float, float, float, float) = OldName;
en mi próximo check in.– Agnel Kurian
16 de junio de 2010 a las 13:30
no tanto como les encantará verte usar nombres aleatorios para funciones de biblioteca estándar.
– jalf
16 de junio de 2010 a las 13:58
no me estoy metiendo con
printf
aquí. Eso fue solo un ejemplo. El problema aquí tiene más que ver con las limitaciones del inglés que con cualquier otra cosa. Tengo una sola función que sirve para el propósito A y el propósito B, pero simplemente no puedo encontrar un solo nombre que sirva para ambos propósitos aquí.– Agnel Kurian
16 de junio de 2010 a las 16:59
@Neil, precisamente.
T &a = b;
crea un nuevo nombre parab
.typedef
para tipos ynamespace A=B;
para espacios de nombres.– Agnel Kurian
17 de junio de 2010 a las 3:41
Hay
using BaseClass::BaseClassMethod
y ahí estáusing AliasType = Type;
e incluso haynamespace AliasNamespace = Namespace;
. Lo que nos falta esusing AliasFunction = Function;
– anton_rh
1 de marzo de 2018 a las 9:12