2016-05-22 8 views
6

私は、テンプレートパラメータに数字のテンプレート引数を持つテンプレートを受け入れたいと思っています。テンプレートテンプレートパラメータを数値にするにはどうすればよいですか?

この例多分過度に単純化されたが、私はこのような何か希望:それは可能でなければならないと私は、このための構文を理解してはいけません

template <int X> 
struct XX 
{ 
    static const int x = X; 
}; 

template<typename TT, TT V, template<V> TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx(XX<1>()) 
} 

を。どうすればこれを達成できますか?少しだけ、あなたの構文を固定

+2

'TT'があることをどのようになっていますか?コンパイラは 'fn'で' fnx'を呼び出すとどのようにその型を推定しますか?あなたはこのアプローチであなたが解決しようとしているあなたの問題のより多くの文脈を与えることができますか? –

+0

@ m.s。おそらく 'int'、おそらく。 – Barry

+0

構文上、 'template class TX'が必要です。しかし、それはすべての問題ではありません。 –

答えて

6

- テンプレートテンプレートパラメータが正しく指定されているので、我々はこのようなものに終わるだろう:

template <typename T, template <T > class Z, T Value> 
//     ^^^^^^^^^^^^^^^^^^^^^ 
void foo(Z<Value> x) { } 

しかし、コンパイラはここTを推測することはできません - それはです推論されないコンテキスト。明示的に指定する必要があります:

foo<int>(XX<1>{}); 

これはかなり面倒です。私はnon_type_t<XX<1>>intであるような型の特性を書くことさえできません(その型の特性は、タイプに対して実際のイントロスペクションを行いますが、たぶんintを返しません)。


非型テンプレート引数の非推定されるコンテキストネスを修正することによって、このプロセス(P0127)を改善するための提案があります。

+0

「テンプレート」提案のように聞こえる、オウルの投票のために。 – chris

+0

@chrisうん、見つけた。 – Barry

+0

ああ、そうです。パラメータ型は型であり、値ではありません。ありがとう。しかし、自動控除の失敗についてはあまりにも悪い。 :( – Adrian

2

fnxの宣言には何らかの作業が必要であり、TTの型番はコールサイトでは推測できません。

template<typename TT, TT V, template<TT> class TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX<V>::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx<int>(XX<1>()); 
} 

の作業例:https://ideone.com/57PsCA

関連する問題