2016-08-04 6 views
1

から列挙型を取得しますか?私。列挙子 "Foo_A"などから列挙型 "Foo"を推論することはできません。それを何らかの理由でテンプレートコードで使用できますか?列挙型クラスはここで助けますか?私はこのようなコードを持っていると仮定すると、列挙子

+2

このコードは、いくつかの問題の解決策のように見えます。何が問題ですか? –

答えて

2

いいえあなたの質問に対する答えは、現在これを行う方法ではありません。あなたが直面していることはtemplate <typename T, T t>イディオムとして知られています。実際にはGoogleの場合は、ほぼ75,000ヒットを見つけるだろうし、回避策はありません。あなたはあなたが持っているように専門化しなければなりません。


しかし、地平線に良いニュースがあります。これは過去10年間に標準化委員会に何度も提案されている:

  • N3405Tがタイプで、tが唯一の値はテンプレート引数として渡された値、あるtemplate <typename T t>の手当を提案
  • N3601template <typename T, T t>は、コンパイラがテンプレート引数として単一の値のみを受け入れるだろうし、それからTt
  • N4469キーワードautoをすることを提案推測う特殊なケースであることを提案しましたメタパラメータを指定するllowed:テンプレート引数t、それのタイプはレネクサ5月4日 `15の会議で

を推定される値が渡されることができることをtemplate <auto t>ように、N4469は最終的に励ましとの要求を稼ぐことでトラクションを得ました標準委員会での改訂:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4539.html#9

最初の改訂版P0127R0が1515年9月25日に提出されました。

フォローアップリビジョンが3月4日16:P0127R1で提出され、Concepts作業用ドラフトセクションの編集を提案しました。

P0127R2コンセプトがC++に含まれるかどうか不明であるため、作業草案の非コンセプトセクションのイディオム変更を完全に指定することに焦点を当てました。この改正は、6月23日'16でのC++ 17標準に受け入れられました:http://developerblog.redhat.com/2016/07/13/red-hat-iso-c-standards-meeting-june-2016-core-language/

だから、C++ 17の到着とあなたがtemplate <typename T, T t>イディオムや使用を処分することができるようになります:

template <auto t> 
struct tpl{ 
    tpl(){ cout << typeid(decltype(t)).name() << ": " << t << endl; } 
}; 
+1

誰かが好奇心を持っていた場合、Visual Studioは 'type_info :: raw_name()'を使用してmangled名を出力します。これは 'type_info :: name()'のGCC出力名に似ています。 –

+0

'f ()'が 'f ()'という別の関数を呼び出すと、これはテンプレートタイプで過負荷になる可能性がありますか? –

+1

@JimVあなたが話していることは、特殊化です(今は可能です)。この質問は 'template 'イディオムに関するものです。ここでは 'tpl 'と呼ぶ必要がありますが、' 13'は明らかに 'int'です。 N4469は、 'tpl <13>'を呼び出して、* type *と* value template引数の両方として*使用できるようにします。 –

関連する問題