Losowo wybrany typ metody szablonowej

0

Siema.
Z metaprogrammingiem miałem do czynienia tylko odrobinę dlatego chciałem się was poradzić.
Powiedzmy, że mamy klasę:

template<typename T>
class Dupa {

};

Czy dałoby się w jakiś sposób instancjonować tę templatkę z losowymi typami, tj. mamy jakąś - listę? - typów np. (int, double, unsigned long) i wybieramy
z niej losowo jakiś typ, po czym tworzymy obiekt:

auto dupa = Dupa<losowy_typ>(); ?

6

To jest funkcjonalność czasu kompilacji, więc nie rozumiem czego oczekujesz.
Troszkę to wygląda na problem XY. Po co ci to jest potrzebne. Jaki problem ma to rozwiązywać?

0

@MarekR22: Potrzebuję wygenerować losowy zbiór danych.
Mam templatkową klasę abstrakcyjną i kilka klas dziedziczących po niej, chcę
wygenerować dane dla jak największej ilości możliwych kombinacji klasa pochodna-typ templaty.

2

C++ ma statycznie weryfikowalne, dobrze określone typy — tzn. już w momencie kompilacji wiadomo, jaki jest typ każdej zmiennej.

Możesz sobie, natomiast, zrobić generowanie w trakcie działania programu — pisząc fabrykę zwracającą std::variant<int, double, unsigned long, …> wg dowolnej logiki, w tym i na podstawie RNG.


EDYCJA: znaczy, no, niby można się pobawić z artystycznym wykorzystaniem void * czy innego union, ale to pakowanie się w UB…

2

Technicznie rzecz biorąc można zrobić jakieś LCG na podstawie szablonu na __TIME__ albo czymś podobnym, ale to są niesamowite kombinacje, a ich zasadność uważam za bardzo ograniczoną.

4
Eldorad O. napisał(a):

@MarekR22: Potrzebuję wygenerować losowy zbiór danych.
Mam templatkową klasę abstrakcyjną i kilka klas dziedziczących po niej, chcę
wygenerować dane dla jak największej ilości możliwych kombinacji klasa pochodna-typ templaty.

To nadal nie jest wyjaśnienie dlaczego potrzebna ci ta funkcjonalność. Opasłeś to samo tylko w innej formie.
Czy ty piszesz testy dla tego szablonu? (to może być powód dla, którego ktoś mógłby chcieć tej funkcjonalności, ale IMO to jest zły pomysł).
Jeśli tak, to nie powinieneś używac "losowych" typów, ale typów, które pokryją testami całe twój kod i interstate warunki brzegowe. Testy powinny być powtarzalne, więc losowość nie jest dobra (są wyjątki).
Przykładowo zestaw typów, który bym użył dla szablonu nie posiadającego specjalizacji

  • użyć int jako Plain Old Data - po przetestowaniu int nie ma sensu testować dla char short double itp
  • użyć std::string jako skomplikowany typ, który może być kopiowany i przenoszony
  • użyc std::unique_ptr<int> jako cos co może być tylko przenoszone
  • użyć const int jako coś czego nie da się kopiować i przenosić

Jeśli szablon ma specjalizacje, to wtedy trzeba dostarczyć typ, który spowoduje użycie specjalizacji

google test ma możliwośc testów iterujących po typie. http://google.github.io/googletest/advanced.html#typed-tests http://google.github.io/googletest/advanced.html#type-parameterized-tests

0
Eldorad O. napisał(a):

@MarekR22: Potrzebuję wygenerować losowy zbiór danych.
Mam templatkową klasę abstrakcyjną i kilka klas dziedziczących po niej, chcę
wygenerować dane dla jak największej ilości możliwych kombinacji klasa pochodna-typ templaty.

Nie do końca czaje, chcesz wygenerować sobie zbiór danych, który będzie miał losowe typy po prostu i gdzies je wpakować? Jeżeli tak to uzyj std::vector<std::variant<T,w,o,j,e,T,y,p,y>> i dla każdego elementu bedziesz mial obiekt z innym typem.

Natomiast jak chcesz w czasie kompilacji wybierać losowo typ no to tu jest trochę problem. Łatwiej byłoby osobnym skryptem/programem generować losowe wartości zapisując do jakiegoś pliku i potem czytać z niego w czasie kompilacji xD.

Niemniej jednak coś czuje, żę twój problem będzie można rozwiązać prościej, ale nie wiem problemy inżynierskie mnie wciąż zaskakują :D

0

O ile pamiętam, to w Modern c++ design Alexandrescu omawiał listy typów i był tam, zdaje się, cały rozdział na ten temat. Możesz też zajrzeć do biblioteki Loki, gdzie jest implementacja z książki, choć trochę przestarzała. Niemniej tę ideę można zaadaptować do bardziej współczesnego standardu.

0
trickle napisał(a):

O ile pamiętam, to w Modern c++ design Alexandrescu omawiał listy typów i był tam, zdaje się, cały rozdział na ten temat. Możesz też zajrzeć do biblioteki Loki, gdzie jest implementacja z książki, choć trochę przestarzała. Niemniej tę ideę można zaadaptować do bardziej współczesnego standardu.

To była koncpecja generowania struktur i klas za pomocą metaprogramowania. Za pomocą sprytnego dziedziczenia tworzyło się całe hierarchie jakby od dołu. Niemniej jednak to nie rozwiązuje jego problemu, bo on jak dobrze rozumiem chce losowo wybierać który typ będzie generował (nie wiem jak sie tłumaczy instatiation poprawnie), ale ma je juz naklepane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1