Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Użycie unii celem pobrania od użytkownika różnych danych

Ostatnio zmodyfikowano 2016-11-21 20:25
Autor Wiadomość
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?
P-153990
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.
P-153991
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ś.
C/C++
#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;
   
    /* Jak kropka to float, nie? :D */
    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.
P-153995
« 1 »
  Strona 1 z 1