#cpp #programowanie chciałbym móc zdefiniować sobie szablonową klasę, coś jak std::tuple tylko z możliwością "indeksowania" jej w runtimie. Funkcjonalnie std::tuple jest dla mnie ok, jedyny problem to indeksowanie tego podczas kompilacji, co mnie nie urządza. Jakieś pomysły? Runtime'owa wersja std::get?:D
Tak naprawdę to bardziej potrzebowałbym takiej compile-time mapy, żeby móc nadać elementom takiej tupli z góry narzucone indeksy... ale to zostawiam sobie na deser. :)
@Mirvan: ale potrzebuje mieć stworzone coś takiego jak std::tuple podczas kompilacji. Nie chce dodawać elementów w runtimie, jedynie je indeksować. No i elementy będą różnego typu (stąd porównanie do std::tuple)
@kalectwo: hmm. Masz rację. Piszę trochę zbyt wiele skrótów myślowych. :/ Generalnie każdy typ, który trzymam w swoim "kontenerze", powinien mieć metodę value() (powiedzmy), która zwraca konkretny typ, np int. Więc w moim przypadku nie ma z tym problemu, takie "getatindex" zwracać będzie tylko jeden typ.
@TheNewIcek: ale to nie da rady, char value() i int value() to dwie zupełnie różne rzeczy - szczegolnie jeżeli to różne klasy, kompilatorowi wisi nazwa.
@kalectwo: Nie tak. Mam N klas, każda z nich ma metodę int value(), bo w większości przypadków mogę sprowadzić ich wartość właśnie do inta. Dla uproszczenia przyjmijmy, że nie jest to jakieś tam value tylko np. int get_hash(). Każda klasa jest "hashowalna" i czasami chce mieć po prostu dostęp w runtimie do hasha N-tego obiektu w tupli. Tylko w przypadku kiedy chce wykonać jakąś operację na konkretnym typie
@kalectwo: http://ideone.com/CjtmHZ mam cos takiego, teraz get_hash definiuje ręcznie. Ale tupla wejsciowa moze sie zmieniac, i bedzie, wiele razy... Chyba dokładniej opisać tego nie potrafię :D. Generalnie chodzi o to, żeby zastąpić get_hash() czymś generycznym.
@TheNewIcek: pokraczne toto jakieś. nie lepiej po prostu zrobić nadklasę Hashable z virtualną metodą get_hash(), i trzymać wektor hashable? naprawdę zastanawiam się skąd ty tyle tych różnych zdefiniowanych tupli weźmiesz, i jak ich będziesz używać, by ci się zunifikowany system hashowania przydał.
@kalectwo: powiedzmy 50 różnych typów. Musiałbym 50 różnych switch-case pisać. Zauważ, że wtedy muszę specjalizować. To tworzy kolejne problemy typu: "zapomniałem dopisać jednego case'a".
@TheNewIcek: Nie bardzo widzę jakbyś chciał to osiągnąć - jeśli chcesz mieć coś w stylu tuple (czyli przechowywanie różnych typów), ale na dużą skalę (index nieznany w trakcie kompilacji), to obawiam się że jest to w praktyce niemożliwe. Jedyna opcja to stworzenie wrapperów z operatorami konwersji, coś takiego jak QVariant w Qt - wtedy możesz wpakować do jednego kontenera różne typy danych. Obawiam się, że skoro Boost czy Qt stosują
@TheNewIcek: nie, switch nie działa na typach. nie możesz przekazać tuple oraz i oczekiwać, że zadziała.
wiesz, teraz naprawdę jestem ciekawy gdzie twoja aplikacja wykorzysta 50 różnych typów. tuple są używane do prostego przerzucania obiektów, gdzie nie zależy ci na operacjach na tym zestawie, chcesz go po prostu gdzieś przekazać jako jeden obiekt i tam rozpakować. To co robisz wygląda na coś zupełnie innego.
@TheNewIcek: I poczytaj sobie o type erasure w C++, bo to jest raczej to czego potrzebujesz. Ja natomiast poważnie przemyślałbym jeszcze raz cały pomysł, bo raczej nasuwa mi się tutaj błędne zaprojektowanie aplikacji.
@TheNewIcek: @kalectwo: to jest bardzo podobne do boost::apply_visitor dla varaint, da sie bez problemu zaimplementowac. Jak sobie nie poradzicie, to moge to zrobic w te sobote podczas czekania na lotnisku.
chciałbym móc zdefiniować sobie szablonową klasę, coś jak std::tuple tylko z możliwością "indeksowania" jej w runtimie. Funkcjonalnie std::tuple jest dla mnie ok, jedyny problem to indeksowanie tego podczas kompilacji, co mnie nie urządza. Jakieś pomysły? Runtime'owa wersja std::get?:D
Tak naprawdę to bardziej potrzebowałbym takiej compile-time mapy, żeby móc nadać elementom takiej tupli z góry narzucone indeksy... ale to zostawiam sobie na deser. :)
jak chcesz różne typy w tym trzymać to będzie ciężko
jakiś vector elementów zawiniętych w boost:any które będziesz musiał rozpakowywać czy cuś
std::tuple foo(6, 'x', 123);ale jedyna możliwość dobrania się do jakiegoś elementu możliwa jest jedynie na etapie kompilacji:
int barint value(), bo w większości przypadków mogę sprowadzić ich wartość właśnie do inta. Dla uproszczenia przyjmijmy, że nie jest to jakieś tam value tylko np.int get_hash(). Każda klasa jest "hashowalna" i czasami chce mieć po prostu dostęp w runtimie do hasha N-tego obiektu w tupli. Tylko w przypadku kiedy chce wykonać jakąś operację na konkretnym typiepo co ci te tuple?
get_hashdefiniuje ręcznie. Ale tupla wejsciowa moze sie zmieniac, i bedzie, wiele razy...Chyba dokładniej opisać tego nie potrafię :D. Generalnie chodzi o to, żeby zastąpić
get_hash()czymś generycznym.wiesz, teraz naprawdę jestem ciekawy gdzie twoja aplikacja wykorzysta 50 różnych typów. tuple są używane do prostego przerzucania obiektów, gdzie nie zależy ci na operacjach na tym zestawie, chcesz go po prostu gdzieś przekazać jako jeden obiekt i tam rozpakować. To co robisz wygląda na coś zupełnie innego.
Ja natomiast poważnie przemyślałbym jeszcze raz cały pomysł, bo raczej nasuwa mi się tutaj błędne zaprojektowanie aplikacji.
boost::apply_visitordla varaint, da sie bez problemu zaimplementowac. Jak sobie nie poradzicie, to moge to zrobic w te sobote podczas czekania na lotnisku.