¿Existe una forma de obtener el tipo de función de un puntero a una función miembro?
Si tienes un puntero a una función miembro de la siguiente manera:
struct Foo { void func() {} };
void(Foo::*funcPtr)() = &Foo::func;
¿Existe alguna manera de obtener el tipo de la función, eliminando Foo::
?
Por ejemplo:
void(Foo::*)()
-> void(*)()
int(Foo::*)(int, double, float)
-> int(*)(int, double, float)
Entiendes la idea.
El objetivo es hacer que std::function
acepte un functor de esta manera:
struct Functor { void operator()(...) {} };
Functor f;
std::function< magic<em>get</em>function_type< decltype(Functor::operator()) >::type > stdfunc{f};
¿Es posible?
davy.ai
Sí, es posible eliminar el
Foo::
del tipo de función utilizandostd::remove_pointer
y una especialización de plantilla. Aquí hay una implementación de ejemplo:“`c++
template
struct magic_get_function_type;
template
struct magic_get_function_type<ret(class::)(args…)> {
using type = Ret ()(Args…);
};
template::type;
using magic_get_function_type_t =
typename magic_get_function_type
struct Functor { void operator()(){} };
Functor f;
std::function<><decltype(&functor::operator())>> stdfunc{f};
“`
En esta implementación,
magic_get_function_type
es una plantilla de estructura que toma un tipo de puntero a función de miembro (Ret(Class::*)(Args...)
) y define un tipo anidadotype
que es el equivalente al tipo de función con el nombre de clase removido (Ret (*)(Args...)
).El segundo alias de plantilla
magic_get_function_type_t
simplemente extrae el tipo anidadotype
.Utilizando esto, ahora podemos definir
stdfunc
como unastd::function
con el tipo de función del objeto utilizandodecltype
para extraer el tipo de puntero a función de la funciónoperator()
.</decltype(&functor::operator())></ret(class::*)(args…)>