Użycie unii celem pobrania od użytkownika różnych danych
Ostatnio zmodyfikowano 2016-11-21 20:25
Szustarol Temat założony przez niniejszego użytkownika |
Użycie unii celem pobrania od użytkownika różnych danych » 2016-11-21 18:11:08 Witam! Ostatnio bawiłem się trochę z templatkami, i faktycznie ciekawie to się sprawdza kiedy pisze się funkcję mająca działać dla różnych rodzajów danych. Jak jednak różne dane pobrać od użytkownika? Chciałbym to zrobić za pomocą unii, pseudokod unia jakastam{ int a; float b; } template <typename T> func (T a){ return a; }
main(){ jakastam instancja; cin >> instancja{}; //w tym momencie komputer "sam" wybiera do ktorej zmiennej zapisac func(instancja); }
z tego co próbowałem, jest to nie możliwe są jakieś inne sposoby? |
|
pekfos |
» 2016-11-21 18:26:14 Tak się tego nie robi. Czego by user nie wpisał, będzie to, siłą rzeczy, tekstem. Wczytuj tekst i potem się zastanawiaj, co to dokładnie jest. Typy muszą być znane w czasie kompilacji, więc nie ma żadnego sposobu na to, by w czasie wykonywania programu typy brały się znikąd. |
|
Gibas11 |
» 2016-11-21 20:25:24 Najprościej byłoby wstawić tą unię jako część struktury i przeładować operator >> std::istream, żeby std::cin mógł to wczytać. //edit: Tak na szybko, żeby pokazać o co mi chodzi. Bez specjalnej kontroli danych na wejściu albo coś. #include <iostream> #include <cstdlib>
struct DataStruct { enum Type { FLOAT, INT } type; union Data { float m_float; int m_int; } data; };
std::istream & operator >>( std::istream & in, DataStruct & instance ) { std::string tmp; in >> tmp; if( tmp.find( '.' ) != std::string::npos ) { instance.data.m_float = atof( tmp.c_str() ); instance.type = DataStruct::FLOAT; } else { instance.data.m_int = atoi( tmp.c_str() ); instance.type = DataStruct::INT; } return in; }
int main() { while( true ) { DataStruct instance; std::cin >> instance; if( instance.type == DataStruct::FLOAT ) { std::cout << "float; " << instance.data.m_float << std::endl; } else { std::cout << "int; " << instance.data.m_int << std::endl; } } return 0; }
//edit2: Zamiast atoi/atof etc. lepiej użyć std::stoi/std::stof itd., bo rzucają wyjątkami kiedy trzeba i w ogóle wow. |
|
« 1 » |