Zastosowanie std::function
and lambdas (or std::bind()
) przechowywać 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();
}
Wynik:
BLAH!
BIM!
BOUM!
BLAH!
kompiluje i uruchomić: http://ideone.com/T6wVp
std::function
mogą być wykorzystywane jako dowolny copyiable przedmiotów, aby czuć się swobodnie przechowywać go gdzieś jako zwrotnego, jak na członka obiektu. Oznacza to również, że można go dowolnie umieszczać w standardowych pojemnikach, takich jak std::vector< std::function< void() > >
.
Należy również pamiętać, że odpowiednik boost::function and boost::bind jest dostępny od lat.
„To również nie jest na matrycy, który czuje się jak mogę robić więcej” Kod C++ nie musi być szablonem na C++. –
@NicolBolas uczciwie to rozwiązanie wykorzystało jeden i działa * naprawdę * dobrze (lambdas) –