2015-02-08 6 views
5

ich eine Funktion möchten, die für Testzwecke ein Array erstellt:C++ einen Variablentyp abhängig machen von der Benutzereingabe

  • Die Idee es dem Benutzer, um die Art der Elemente wählen das Array enthält (int, float , doppelt).
  • Dann muss es ein Array des ausgewählten Typs zurückgeben und Haupt muss es als Parameter verwenden. Ich verstehe, dass dies mit einem void Zeiger getan wird, aber ich würde mich freuen, wenn mir jemand ein Beispiel geben könnte.

So wäre dies der Beispielcode sein

**type** vector() 
    { 
    int t; 
    int op; 
    cout << "Size: \n"; 
    cin >> t; 
    **type** * v = new **type**[t] 
    cout << "Select type\n"; 
    cin >> op; 
    switch(op) { 
    case 0: 
      // Create the array with the selected option... 
      return * v; 
    case 1: 
      // Create the array with the selected option... 
      return * v; 
    default: 
      // Other stuff; 
       } 
    } 

So ist die Frage wäre, welche Art von Funktion soll ich verwenden, und auch, welche Art von dynamischen Variablen sollte ich als v erklären.

Und auch wie man es später bei anderen Funktionen einmal richtig einsetzt.

Danke.

+1

Was wollen Sie zu _do_ mit einem Array unbekannter Art in Haupt? –

+0

Ich muss den Kompilierlauf und die Wandzeiten abhängig von verschiedenen Faktoren testen. Einer von ihnen ist der Variablentyp. Ich lerne Mathematik und wir lernen etwas über die Speichernutzung und Logarithmen für die Arbeit mit ganzen Zahlen, falls sie benötigt werden. Die Idee ist es, main for test algorithms wie quicksort, mergesort ... – D1X

+1

zu verwenden. Aber es scheint der beste Weg zu sein, verschiedene Funktionen für jeden Typ zu verwenden. – D1X

Antwort

2

Die einfache Antwort ist, dass Sie nicht können, weil Datentypen speziell zur Kompilierzeit deklariert werden müssen.

Wenn Sie Boost-Bibliotheken verwenden können,

boost::variant<int,float,double> vec; 

können Ihre Bedürfnisse.

Sie können nicht union verwenden, da std::vector kein POD ist (Plain Old Datentyp).

EDIT:

Wie @ Rob wies darauf hin:

Void-Zeiger müssen aber in einen Zeiger auf etwas umgewandelt werden - bei der Kompilierung - bevor sie auf diese Weise verwendet werden. So ist die Antwort immer noch "kann nicht" void Zeiger verwenden, um einen variablen Datentyp zu machen.

+0

Okay, also zu beiden Fragen nein? – D1X

+0

Ich dachte, der zweite wäre möglich. – D1X

+3

Void-Zeiger müssen vor der Kompilierung in einen Zeiger auf etwas anderes umgewandelt werden, bevor sie auf diese Weise verwendet werden können. Die Antwort lautet also immer noch "kann nicht". – Rob

2

Da C++ eine statisch typisierte Sprache ist, können Sie dies nicht auf einfache Weise tun. Sie können Typen zur Laufzeit nicht bestimmen, diese werden behoben, sobald Ihr Programm kompiliert wurde.

Die nächste Sache, die Sie für Ihren Fall IMHO erhalten können, ist so etwas wie ein boost::variant oder boost::any.

1

Ich denke, du solltest dein Design überdenken.

Anstatt zu versuchen, eine Funktion zu schreiben, die ein Array von benutzerdefinierten Typen zum Testen zurückgibt. Ich würde stattdessen eine andere Testfunktion aufrufen, abhängig von der Benutzerwahl.

Die Testfunktion kann als Templat werden Code-Duplizierung zu vermeiden:

#include <vector> 
#include <iostream> 

template<typename T> 
void doTest(unsigned size) { 

    std::vector<T> data(size); 

    // Do the actual test on the data... 
} 


int main() { 
    unsigned size; 
    std::cout << "Size: \n"; 
    std::cin >> size; 

    int op; 
    std::cout << "Select type\n"; 
    std::cin >> op; 
    switch(op) { 
    case 0: 
     doTest<int>(size); 
     break; 
    case 1: 
    default: 
     doTest<float>(size); 
    } 
} 

Wenn Sie wirklich Ihr Array aus einer Funktion zurückgeben möchten Sie es in einer polymorphen Typ wickeln könnte.Aber um wirklich alles mit dem Array zu tun, müssten Sie eine virtuelle Methode auf dem polymorphen Typ aufrufen, damit ich nicht sehe, wie es Ihnen etwas über den Aufruf einer Testfunktion direkt kauft.

0

es kann mit void* getan werden, aber in diesem Fall müssen Sie tun, Gießen selbst (wie von @Rob hingewiesen), d. H. Mit reinterpret_cast Operator oder ähnliches. Hier ist ein einfaches Beispiel mit void *

void* vector(){ 
    int t; 
    int op; 
    cout << "Size: \n"; 
    cin >> t; 
    cout << "Select type\n"; 
    cin >> op; 
    switch(op) { 
    case 0: 
      // Create the array with the selected option... 
      return reinterpret_cast<void*>(new int[t]); 

    case 1: 
      // Create the array with the selected option... 
      return reinterpret_cast<void*>(new double[t]); 

    default: 
      // Other stuff; 
      return reinterpret_cast<void*>(new float[t]); 
     } 
    } 

Hinweis: Sie arbeiten von malloc() Funktion aussehen kann, es gibt immer void* zu zugewiesenen Speicher und Sie müssen geben Sie es werfen sich zB malloc(sizeof(int)*t)

+0

Was soll das OP mit dem Ergebnis dieser Funktion machen? –

+0

ja du bist rite. Ich werde nicht nützlich sein, um void zu verwenden * es wäre besser, Design-Muster wie Fabrikmuster hier zu verwenden und OP als Argument zu übergeben. Besser, das Design neu zu denken. – mohsan

+0

Ein 'enum''out-Parameter, der den Ergebnistyp angibt, würde ausreichen –

Verwandte Themen