es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible eliminar el Foo:: del tipo de función utilizando std::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
    using magic_get_function_type_t =
    typename magic_get_function_type::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 anidado type 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 anidado type.

    Utilizando esto, ahora podemos definir stdfunc como una std::function con el tipo de función del objeto utilizando decltype para extraer el tipo de puntero a función de la función operator().</decltype(&functor::operator())></ret(class::*)(args…)>

Comments are closed.