2015-02-08 69 views
5

我想創建用於測試目的的數組的函數:c + +做出可變類型取決於用戶輸入

  • 想法ES使用戶選擇該陣列將包含元素的類型(整數,浮點,雙)。
  • 然後它必須返回所選類型的數組,並且主要必須使用它作爲參數。我明白這是通過使用void pointer完成的,但如果有人能夠給我一個例子,我會很高興。

因此,這將是示例代碼

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

所以,問題是我應該使用什麼類型的函數,也是我應該聲明什麼類型的動態變量作爲訴

以及如何正確完成後再使用其他功能。

謝謝。

+1

你想要什麼使用main中未知類型的數組來執行_do_? – 2015-02-08 14:01:18

+0

我需要根據不同的因素測試編譯運行和壁掛時間。其中之一是變量類型。我學習數學,我們正在學習內存使用情況,並在需要時使用對數來處理整數。這個想法是使用main來測試algorithmns,比如quicksort,mergesort ... – D1X 2015-02-08 14:08:30

+1

但是看起來最好的方法是對每種類型使用不同的函數。 – D1X 2015-02-08 14:17:21

回答

2

簡單的答案是你不能,因爲數據類型需要在編譯時專門聲明。

如果你可以使用Boost庫,

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

能滿足您的需求。

您不能使用union,因爲std::vector不是POD(普通舊數據類型)。

編輯:

由於@Rob指出:

空指針需要轉換成一個指向別的東西 - 在編譯時 - 他們可以使用方式之前。所以答案是 仍然「不能」使用void指針來創建一個可變的數據類型。

+0

好吧,所以對於這兩個問題沒有? – D1X 2015-02-08 14:02:52

+0

我以爲第二個是可能的。 – D1X 2015-02-08 14:03:10

+3

無效指針需要在編譯時轉換爲指向別的東西的指針 - 才能以這種方式使用它們。所以答案仍然是「不能」。 – Rob 2015-02-08 14:19:32

2

由於C++是一種靜態類型語言,因此您不能通過簡單的方式來實現。您無法在運行時確定類型,只要您的程序編譯完成,這些類型就會被修復。

你可以得到最接近你的情況恕我直言,正在使用類似boost::variantboost::any

1

我認爲你應該重新考慮你的設計。

而不是試圖編寫一個函數,返回一個用戶定義類型的數組來測試。我會根據用戶的選擇調用不同的測試功能。

測試功能可以作爲模板,以避免重複代碼:

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

如果你真的想從一個函數返回數組您可以在一個多態型包裹。但是要真正對數組做任何事情,你需要調用一個多態類型的虛方法,所以我不知道它如何直接調用測試函數來購買任何東西。

0

它可以使用void*完成,但在這種情況下,您需要自己進行類型轉換(如@Rob指出的那樣),即使用reinterpret_cast運算符或類似方法。下面是一個簡單的例子,用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]); 
     } 
    } 

注意:你可以看看malloc()功能的工作,它總是返回void*到分配的內存,你必須輸入自己投它如malloc(sizeof(int)*t)

+0

OP應該如何處理這個函數的結果? – 2015-02-08 17:54:15

+0

是的,你是禮儀。使用void *我不會有用*在這裏使用像工廠模式這樣的設計模式並將OP作爲參數傳遞會更好。更好地重新考慮設計。 – mohsan 2015-02-08 18:38:47

+0

指示結果類型的'enum'「out參數」將會執行 – 2015-02-08 18:39:39