en2senpai Temat założony przez niniejszego użytkownika |
Wyrazenia lambda i jak je przekazywac ? » 2017-03-07 13:03:10 Witam, Chce stworzyc mechanizm obslugi eventow, tak aby uzytkownik sam mogl wytworzyc wlasny, dowolny warunek bazujacy na spelnieni podanego przez niego wyrazenia. Czy zasadnym jest uzycie do tego celu wyrazen lambda? np: int a = 3; int b = 4; auto lambda =[ & a, & b ]()->bool { return a == b ? true: false; };
Czy jest mozliwosc zapisania podanego wyrazenia lambda w pamieci, tak aby okresowo moc je sprawdzac (klasa nadrzedna zawierajaca tablice eventow, sprawdzajaca czy zachodzi podany przez uzytkownika warunek)? Na capture list wyrazenia sa referencje do zmiennych a i b, wiec w ramie defacto tworzy sie struktura zawierajaca 2 adresy Gdzie jest natomiast adres samej funkcji ? (zapisany w pamieci ROM) Jakiego typu dokladnie jest w tym wypadku lambda? Mozna stworzyc strukture, ktora bedzie przechowywala wszystkie informacje niezbedne do pozniejszego sprawdzenia warunku ? Finalnie czy mozna je przekazywac do funkcji (widzialem podejscia z szablonami), ktora bedzie w pewien sposob uniwersalna i dokona zapisania warunku (kazdego, zakladajac ze kazda inna lambda bedzie juz innym typem) |
|
Monika90 |
» 2017-03-07 13:44:48 Wartości różnych wyrażeń lambda można trzymać w std::vector<std::function<F>> gdzie F to typ postaci TypZwracay (Arg1, Arg2, itd...) w twoim przykładzie byłby to bool () |
|
en2senpai Temat założony przez niniejszego użytkownika |
» 2017-03-07 14:02:26 Ciekawa propozycja, gdzies juz ja widzialem. Mozna jednak uniknac std::function? Narazie zrobilem to tak. Klasa event.h template < class T > class event { uint32_t * _address; public: event( uint32_t * address ); ~event(); bool check(); };
template < class T > event < T >::event( uint32_t * address ) { _address = address; }
template < class T > event < T >::~event() { }
template < class T > bool event < T >::check() { T temp = *( T * ) _address; return temp(); }
Natomiast do testow mam cos takiego: int a = 3; int b = 4; volatile bool wynik;
auto warunek1 =[ & a, & b ]()->bool { return a == b ? true: false; }; auto warunek2 =[ & a, & b ]()->bool { return a < b ? true: false; };
event < decltype( warunek1 ) > event1(( uint32_t * ) & warunek1 ); event < decltype( warunek2 ) > event2(( uint32_t * ) & warunek2 );
wynik = event1.check(); wynik = event2.check();
b = 3;
wynik = event1.check(); wynik = event2.check();
|
|
Monika90 |
» 2017-03-07 14:23:37 To są jakieś przedziwne kombinacje, bo ten sam efekt można osiągnąć prościej template < class Func > struct func_ref { Func & f; bool check() const { return f(); } };
int main() { int a = 3; int b = 4; volatile bool wynik; auto warunek1 =[ & a, & b ] { return a == b; }; auto warunek2 =[ & a, & b ] { return a < b; }; func_ref < decltype( warunek1 ) > event1 { warunek1 }; func_ref < decltype( warunek2 ) > event2 { warunek2 }; wynik = event1.check(); wynik = event2.check(); b = 3; wynik = event1.check(); wynik = event2.check(); }
A jeżeli chcesz żeby zmienne event1 i evet2 były tego samego typu, to musisz użyć type erasure i do tego właśnie służy std::function |
|
en2senpai Temat założony przez niniejszego użytkownika |
» 2017-03-07 14:59:19 Wlasnie chodzi o to zeby wszystkie eventy mialy ten sam typ, aby mozna bylo zrobic ich zbior (teraz trzeba bedzie zrobic klase bazowa, po ktorej klasa event dziedziczy i nie jest szablonowa, nastepnie ich tablice i zapisywac wskazniki na eventy - pokrecone aczkolwiek do tego zmierzam) |
|
en2senpai Temat założony przez niniejszego użytkownika |
» 2017-03-07 16:55:09 Delikatnie uproscilem klase template < typename T > class event { T * fun; public: event( T & l ); ~event(); bool check(); };
template < typename T > event < T >::event( T & l ) { fun = & l; }
template < typename T > event < T >::~event() { }
template < class T > bool event < T >::check() { T temp = * fun; return temp(); }
i teraz mozna powolac obiekt event < decltype( warunek1 ) > event1( warunek1 );
Mozna jakos poprawic metode check()? Tak zeby tylko wykozystac posiadany wskaznik, nie robic kopiowania do obiektu temp ? |
|
Monika90 |
» 2017-03-07 17:09:12 |
|
« 1 » |