Wpis z mikrobloga

#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. :)
  • 23
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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)
  • Odpowiedz
@TheNewIcek: nie wiem czy ci o to chodzi ale

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ś
  • Odpowiedz
@kalectwo: też nie. Wyjdźmy od std::tuple. To w zasadzie jest dla mnie ok. Mogę sobie trzymać różne typy:

std::tuple foo(6, 'x', 123);
ale jedyna możliwość dobrania się do jakiegoś elementu możliwa jest jedynie na etapie kompilacji:

int bar
  • Odpowiedz
@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.
  • Odpowiedz
@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
  • Odpowiedz
@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ł.
  • Odpowiedz
@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".
  • Odpowiedz
@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ą
  • Odpowiedz
@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.
  • Odpowiedz
@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.
  • Odpowiedz