2017-10-19 11 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'を実装する必要があります。 – chris

答えて

-1

たぶん、このような何かが動作するはずです:

MyStruct<decltype(e)> var; 
関連する問題