Uso std::function
and lambdas (or std::bind()
) para almacenar callables:
#include <functional>
#include <iostream>
class Test
{
public:
void blah() { std::cout << "BLAH!" << std::endl; }
};
class Bim
{
public:
void operator()(){ std::cout << "BIM!" << std::endl; }
};
void boum() { std::cout << "BOUM!" << std::endl; }
int main()
{
// store the member function of an object:
Test test;
std::function< void() > callback = std::bind(&Test::blah, test);
callback();
// store a callable object (by copy)
callback = Bim{};
callback();
// store the address of a static function
callback = &boum;
callback();
// store a copy of a lambda (that is a callable object)
callback = [&]{ test.blah(); }; // often clearer -and not more expensive- than std::bind()
callback();
}
Resultado:
blah!
BIM!
BOUM!
BLAH!
compila y ejecuta: http://ideone.com/T6wVp
std::function
se puede utilizar como cualquier objeto copyiable, por lo que no dude en almacenar en algún lugar como una devolución de llamada, al igual que en el miembro de objeto. También significa que puede colocarlo libremente en contenedores estándar, como std::vector< std::function< void() > >
.
También tenga en cuenta que el equivalente boost::function and boost::bind ha estado disponible desde hace años.
"Tampoco se templated que se siente como que podría estar haciendo más" El código de C++ no tiene que ser una plantilla para ser C++. –
@NicolBolas para ser justos, esta solución usó una y funciona * realmente * bien (lambdas) –