2017-10-19 87 views
0

來創建特定類型我有一個模板c + +動態地從模板

enum MyEnum = {MyEnum _1, MyEnum _2, ...}; 
template<MyEnum T> 
struct MyStruct { 
    ... 
} 

現在我想創建一個特定類型的基於條件的模板。但是,MyEnum中有一些元素是開放的,所以我不能通過某種開關來完成。

所以我在尋找一種方式做一些像

void doStuff() { 
    MyEnum e = getType(); 
    MyStruct<e> s; 
} 

但編譯器抱怨,e不是一個常量表達式。這是有道理的,因爲我有運行時信息。有沒有一種方法能夠完美地構建一些模仿

doStuff() { 
    MyEnum e = getType(); 
    Switch(e) { 
     case MyEnum_1: 
      MyStruct<MyEnum_1> s; 
      .... 
     case MyEnum_2: ... 
    ... 
} 

原因是,如前所述,枚舉的列表可能會擴展/定期更換,我寧願不用維護的代碼在其他結​​束每次發生時。

+0

這不能做。 C++不能以這種方式工作。模板實例在編譯時定義,而不是運行時。你必須使用'switch',或者一個邏輯等價物。 –

+0

是的,[本提案]中描述的技術(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0376r0.html)和[作者的討論](https: //www.youtube.com/watch?v=Fjw7NjndQ50)。通過提供可能值的上限和下限,可以將運行時值作爲參數(更精確地說,是其類型)中的常量表達式接收。實際的技術並沒有太多的細節,但是AFAIK,它只是需要實現'std :: visit',所以也許一些'variant'實現文章會有更多。 – chris

回答

-1

也許這樣的事情應該工作:

MyStruct<decltype(e)> var;