2013-01-05 40 views
8

這裏是:我想創建一個void函數,它將接收兩個衆所周知的值類型和另一個可能是任何類型的值。該代碼會是這樣:C++發送任何類型的參數給一個函數

void change_settings(string element, short setting, ??? value) { 
    switch (setting) { 
     case ST_NAME: 
      // Cast value to string or char* and change element.name 
     break; 
     case ST_AMOUNT: 
      // Cast value to integer and change element.amount 
     break; 
     case ST_ENABLED: 
      // Cast value to boolean and change element.enabled 
     break; 
    } 
} 

我tryied使值的類型const void*但我得到一個錯誤(cast from ‘const void*’ to ‘short int’ loses precision),因爲我只是做了這一點:short name = (short)value,必須是一些瘋狂的絕望的審判,希望能得到幸運。現在,我不知道是否有辦法做到這一點,傳遞任何類型的變量的指針,然後將其轉換爲它是什麼(我知道根據每種情況期望的變量類型。 我該如何做到這一點?!謝謝

回答

7

因爲你似乎事先知道所有潛在類型的value,並且要根據類型不同的行爲,你可以只寫了一系列函數重載:

void change_settings(const std::string& element, short setting, const std::string& value); 

void change_settings(const std::string& element, short setting, int value); 

void change_settings(const std::string& element, short setting, bool value); 

這消除需要一個運行時間開關

+0

這是事實,但在這一點上,爲什麼不爲每個設定不同的功能,避免了開關的情況下。 – Caesar

+0

是的 - 它使'設置'變量不必要。 –

+1

讓我們試試這個。當然,我仍然可以使用開關和設置,如果我有不同的情況下,我需要一個int值,例如 – ali

5

假設你在談論運行時間開關(與編譯時相反,在這種情況下模板可能是答案):

你可以考慮一個變體類(例如,或者可能使用多態性(即,定義繼承層次結構和虛擬功能來實現特定行爲)。

+0

我想這是做這件事的專業方式,但是當我創建一些嚴肅的應用程序時,我會記住它。謝謝 – ali

+0

你的意思是'boost :: any'作爲第二個選項?> – Puppy

12

您應該使用templates

template <typename T> 
void change_settings(string element, short setting, T value); 
+0

太棒了!謝謝!那樣做 – ali

+2

問題是當'T'是錯誤的類型時,他的運行時切換代碼中的強制轉換將無法編譯。我只是寫了一系列函數重載 –

+0

事實上,這就是發生了什麼。 – ali

相關問題