2015-02-08 8 views
5

voglio una funzione che crea una matrice a scopo di test:C++ fare un tipo di variabile dipende input dell'utente

  • l'idea es di rendere l'utente seleziona il tipo di elementi dell'array conterrà (int, float , Doppio).
  • Quindi deve restituire un array del tipo selezionato e principale deve usare come parametro un. Capisco questo è fatto usando un puntatore vuoto, ma sarei felice se qualcuno potrebbe fornirmi un esempio.

quindi questo sarebbe il codice di esempio

**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; 
       } 
    } 

Quindi la domanda sarebbe che tipo di funzione dovrei usare, e anche che tipo di variabile dinamica dovrei dichiarare come v.

E anche come usarlo in seguito su altre funzioni, una volta fatto correttamente.

Grazie.

+1

Cosa vuoi a _do_ con una matrice di tipo sconosciuto in main? –

+0

Ho bisogno di testare i tempi di esecuzione e wall a seconda di diversi fattori. Uno di questi è il tipo di variabile. Studio matematica e stiamo imparando sull'uso della memoria e sull'uso dei logaritmi per lavorare con i numeri interi nel caso sia necessario. L'idea è di usare main per testare algoritmi come quicksort, mergesort ... – D1X

+1

Ma sembra che il modo migliore sia usare diverse funzioni per ogni tipo. – D1X

risposta

2

La semplice risposta è che il numero non può essere, poiché i tipi di dati devono essere dichiarati in modo specifico al momento della compilazione.

Se è possibile utilizzare le librerie Boost,

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

può soddisfare le vostre esigenze.

Non è possibile utilizzare union perché std::vector non è un POD (Plain Old Tipo di dati) .

EDIT:

Come @ Rob ha sottolineato:

puntatori void bisogno di essere convertito in un puntatore a qualcosa d'altro - al momento della compilazione - prima che possano essere utilizzati in questo modo. Quindi la risposta è ancora "impossibile" utilizzare i puntatori void per creare un tipo di dati variabile.

+0

Ok, quindi ad entrambe le domande no? – D1X

+0

Pensavo che il secondo fosse possibile. – D1X

+3

I puntatori void devono essere convertiti in un puntatore a qualcos'altro - in fase di compilazione - prima di poter essere utilizzati in questo modo. Quindi la risposta è ancora "impossibile". – Rob

2

Poiché il C++ è un linguaggio tipizzato in modo statico, non è possibile farlo in modo semplice. Non è possibile determinare i tipi in fase di esecuzione, questi sono corretti non appena il programma è stato compilato.

La cosa più vicina che puoi ottenere per il tuo caso IMHO, sta usando qualcosa come boost::variant o .

1

Penso che dovresti ripensare al tuo design.

Piuttosto che provare a scrivere una funzione che restituisce un array di tipo definito dall'utente da testare. Vorrei invece chiamare una funzione di test diversa a seconda della scelta dell'utente.

La funzione di test può essere basato su modelli al fine di evitare la duplicazione del codice:

#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); 
    } 
} 

Se si vuole veramente tornare l'array da una funzione si poteva avvolgerlo in un tipo polimorfico.Ma per fare effettivamente qualsiasi cosa con l'array, è necessario chiamare un metodo virtuale sul tipo polimorfico, quindi non vedo come ti compri qualcosa chiamando direttamente una funzione di test.

0

può essere eseguito utilizzando void* ma in tal caso è necessario eseguire il casting di tipo (come indicato da @Rob), ad esempio utilizzando l'operatore reinterpret_cast o simile. Ecco un semplice esempio con 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]); 
     } 
    } 

Nota: si può guardare al lavoro di malloc() funzione, torna sempre void* di memoria allocata e si deve digitare lanciare da soli ad esempio malloc(sizeof(int)*t)

+0

Cosa deve fare OP con il risultato di questa funzione? –

+0

sì, sei rito. Non sarò utile per usare void * sarebbe meglio usare il design patter come il factory pattern qui e passare OP come argomento. Meglio ripensare al design. – mohsan

+0

Un "parametro" out "enum'" che indica il tipo di risultato farebbe –

Problemi correlati