2012-02-29 83 views
0

我有一個模板,我想與適當的對象類型來調用,而不必分析字符串標識符/枚舉/ typeid.name()等使用字符串聲明變量類型

即,相當比:

switch(varType) 
{ 
case TYPE_ONE: 
    templateFunction<TYPE_ONE>(); 
    break; 

case TYPE_TWO: 
    templateFunction<TYPE_TWO>(); 
    break; 
... 
etc... 
} 

我寧願使用:

templateFunction<GetTypeFromEnum(MyEnum::INT)>(); 

或更好:

templateFunction<GetTypeFromString("int")>(); 

東西就像一個反向typeid?

我實際上設法做到這一點在VBA一次,所以我想它必須在C++可行...

+0

你們是不是要重新實現'提高:: variant'? – kennytm 2012-02-29 17:45:11

+0

boost :: variant的訪客實現肯定會起作用,但意味着在approprite operator()重載中調用我的模板化函數。沒關係,我想。不過,如果我有幾個模板函數,我可能會打電話(我也會這樣做),但它會變得更復雜一些。我可以看到使用boost :: variant,如果這真的是唯一的選擇...也許這是一個比看起來更好的選擇...? – 2012-02-29 18:32:32

+0

我拿回來了(一點)。如果我在調用訪問器之前向訪問者傳遞了一個函數指針和一個對象引用,它確實可以簡化訪問者的實現......但是,我是學習C++的一個堅果,所以我仍然對任何其他方法感興趣。否則,看起來像boost :: variant可能是要走的路。 – 2012-02-29 18:42:15

回答

0

你可以重新定義你的templateFunction所以採取虛擬參數?

template <typename T> 
void templateFunction(const T& Dummy) 
{ 
    // Do nothing with Dummy 
} 

這樣做,你只需要通過您的變量varType,你調用該函數:

templateFunction(varType); 
+0

就是這樣 - 我實際上沒有必要類型的變量。我想通過傳遞一個表示類型名稱的字符串來生成一個類型的變量。有點像typeid.name()函數的反轉 - 我指定一個字符串並取回指定類型的變量。 – 2012-02-29 18:13:20

+0

我明白,你的'switch'例子讓我困惑。我不認爲有''typeid()。name()'reversal'這樣的事情,可能'boost :: variant'是你的不良選擇。 – 2012-02-29 18:38:00