Estoy tratando de usar std::function
junto con std::bind
, pero estoy teniendo algunos problemas.Obtener el puntero a la función de std :: function cuando se utiliza std :: bind
Esto funciona:
#include <functional>
#include <iostream>
void print() {
std::cout << 2;
}
int main() {
std::function<void()> foo = print;
(*foo.target<void (*)()>())(); //prints 3
}
Esto se estrella en la segunda línea de main
:
#include <functional>
#include <iostream>
void print (int i) {
std::cout << i;
}
int main() {
std::function<void()> foo = std::bind (print, 2);
(*foo.target<void (*)()>())();
}
realmente estoy sosteniendo el std::function<void()>
y la necesidad de ser capaz de volver a la función; no solo llámalo. Espero que el uso sería algo como esto:
#include <functional>
#include <iostream>
void print (int i) {
std::cout << i;
}
int main() {
Container c (std::bind (print, 2));
//I would expect the original
c.func() (3); //prints 3
if (c.func() == print) /* this is what I'm mostly getting at */
}
¿Hay alguna manera de obtener la función original para devolverlo, o una alternativa? También entra en conflicto con el tipo de devolución, ya que void (*)()
coincide bastante bien con la firma encuadernada.
Esto simplemente no es posible: no hay función con una firma 'void()' en su código. Si hubiera sido posible, no necesitaríamos 'std :: function'. –
@ R.MartinhoFernandes, fue un buen truco para almacenar una función genérica, pero parece que solo funciona. – chris
@ chris: ¿Es el objetivo de almacenar una función genérica? Comparar las funciones genéricas se vuelve * muy * complicado, y esto es solo la punta del iceberg. – Puppy