Gracias a Stefan Pabst por la siguiente idea, wh que presentó en una charla relámpago de cinco minutos en ACCU 2015. Lo amplié con tipos de etiquetas para permitir la resolución de sobrecargas por su calificador de cv y/o calificador de referencia, y una plantilla variable de C++ 17 para evitar tener que escribir el par adicional de paréntesis que de otro modo se requiere.
Esta solución funciona según el mismo principio que las respuestas basadas en el molde, pero evita tener que repetir el tipo de retorno de la función o, en el caso de funciones miembro, el nombre de la clase que la función es miembro de, como el compilador es capaz de deducir estas cosas.
bool free_func(int, int) { return 42; }
char free_func(int, float) { return true; }
struct foo {
void mem_func(int) {}
void mem_func(int) const {}
void mem_func(long double) const {}
};
int main() {
auto f1 = underload<int, float>(free_func);
auto f2 = underload<long double>(&foo::mem_func);
auto f3 = underload<cv_none, int>(&foo::mem_func);
auto f4 = underload<cv_const, int>(&foo::mem_func);
}
El código de la aplicación de la plantilla de underload
es here.
Gracias! ¿Qué pasa si las funciones miembro son estáticas? (Estoy obteniendo el 'error: dirección de la función sobrecargada sin información de tipo contextual') –
@Neil: ver mi edición –
Oh, ya veo, me deshago del primer' A :: 'para las funciones estáticas, ya que pueden ser lanzado a punteros regulares. Me ganaste :) –