bedingter datentyp durch switch

Gamer123

Mitglied
hi

ich weis nicht ob und wie folgendes Problem funktioniert
ich würde gern durch eine Switch Verzweigung einen Datentyp variabel auswählen können
also

Code:
swich (type)
{
case 1:  int value = 42;
break;

case 2: double value = 0.815;
break;
}

cout << value << endl;

am ende der Switch kenn der Compiler leider "value" nicht mehr

vielen Dank schonmal
 
am ende der Switch kenn der Compiler leider "value" nicht mehr
Was auch ganz klar ist, da der Sichtbarkeitsbereich der beiden Variablen nach dem switch erloschen ist.

Du könntest dir mit einer union und Operatorüberladung helfen:

C++:
#include <iostream>

struct IntOrDouble {
  enum {
    UNDEFINED, INT, DOUBLE
  } type;
  union {
    int int_;
    double double_;
  };

  IntOrDouble() : type(UNDEFINED) {}
  IntOrDouble(int i) : type(INT), int_(i) {}
  IntOrDouble(double d) : type(DOUBLE), double_(d) {}
};

std::ostream &operator<<(std::ostream &s, const IntOrDouble &value) {
  switch (value.type) {
    case IntOrDouble::INT:
      s << value.int_;
      break;
    case IntOrDouble::DOUBLE:
      s << value.double_;
      break;
  }
  return s;
}

int main() {
  IntOrDouble value;
  int type = 1;
  switch (type) {
    case 1: value = IntOrDouble(42); break;
    case 2: value = IntOrDouble(0.815); break;
  }
  std::cout << value << std::endl;
}
Das ist allerdings mehr verwirrend als alles andere. Wozu brauchst du denn diese Funktionalität? Vermutlich lässt sich das übergeordnete Problem auch anders lösen. Ansonsten kannst du auch einen Blick auf Boost.Variant werfen.

Grüße,
Matthias
 
danke für schnelle antwort

das nach der } value nicht mehr existiert ist mir bekannt, wollte nur auf das Problem verweisen

Sinn des ganzen ist, ich habe ein Klassen Template und der Benutzer soll entscheiden können als was die Klasse erstellt werden soll

ich probiere noch ein wenig mit union herrum, sollte es eine bessere möglichkeit geben, die nehme ich gerne an


Edit
PS: ich wusste garnicht das man in structs auch Methoden definieren kann, habe gedacht das geht nur in Klassen
 
Zuletzt bearbeitet:
Hallo Gamer123,

Die von Matthias erwähnte Klasse Boost.Variant oder auch Boost.any sind sicher eine der besseren Möglichkeiten, die du verwenden könntest.

Gruss
Muepe
 
Sinn des ganzen ist, ich habe ein Klassen Template und der Benutzer soll entscheiden können als was die Klasse erstellt werden soll
Du willst den Templateparameter also zur Laufzeit bestimmen? In dem Fall würde ich eher zu einer abstrakten Basisklasse mit virtuellen Funktionen greifen:

C++:
#include <iostream>

class Base {
 public:
  virtual ~Base() {}
  virtual std::ostream &Print(std::ostream &) const = 0;
};

template<class T>
class Derived : public Base {
 public:
  Derived(const T &data) : data_(data) {}
  std::ostream &Print(std::ostream &s) const {
    return s << data_;
  }

 private:
  T data_;
};

std::ostream &operator<<(std::ostream &s, const Base &b) {
  return b.Print(s);
}

int main() {
  Base *value;
  int type = 1;
  switch (type) {
    case 1: value = new Derived<int>(42); break;
    case 2: value = new Derived<double>(0.815); break;
    default: return 0;
  }
  std::cout << *value << std::endl;
  delete value;
}

Grüße,
Matthias
 
Vielen Dank

so sollte es gehen,

ich habe allerding eine andere Möglichkeit gewählt, ich habe direkt in den cases die Berechnung und die Ausgabe gelegt.

Deine Variante wäre für meine Aufgabe zu umfangreich gewesen, trotzdem vielen Dank für deine Mühe

Grüße Gamer123
 
Zurück