2017-10-08 7 views
7

しばらくして、テンプレートの力テンプレートパラメータを再び発見しました。例えば、次のスニペット:テンプレートテンプレートパラメータにエイリアステンプレートを推測して、引き続きそのプロパティを保持しながらコンテキストを推定する方法はありますか?

template <template <class> class TT, class T> 
void foo(TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo<typer>(int{}); 
} 

エイリアステンプレートはテンプレートテンプレートパラメータとしてテンプレートに渡され、それがコンテキスト推定されるテンプレートの他のパラメータを検出するためにさらに使用されます。美しさ!

ただしエイリアステンプレート自体は、コンパイラが狂っ得るように見える推論する必要がちょうどその時:TTが同様に両方tag<TT>から推定することができるようコースの

template <template <class> class> 
struct tag{}; 

template <template <class> class TT, class T> 
void foo(tag<TT>, TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo(tag<typer>{}, int{}); 
} 

[live demo]

コンパイラは正しいですTT<T>パラメータがfooであり、int{}がテンプレートパターンとタイプパラメータパターンと一致しません。 Tの控除コンテキストを保存する方法はありますか?TTは、コンテキストを非推定としてTT<T>にしますか?

P.S.私の意図は純粋であり、これはそれの背後にYの問題がない理論的な質問に過ぎない。

+0

正直に私はどちらも最初の_beautifulneを見ることはできません2回目の試行には使用できません。とにかく質問は興味深いです、+1。 – skypjack

+0

@skypjack私が言ったように、私は考えられる可能性についても考えていないので、あなたは正しいかもしれません... –

答えて

2

が、私は何か書くために/容易に明確になると思います。

template <template <class> class TT, class T> 
void foo(tag<TT>, T, std::enable_if_t< std::is_same<T,TT<T>>::value >* = 0) 

またはサイドノートとしてはあまり制約

template <template <class> class TT, class T> 
void foo_impl(tag<TT>, TT<T>){} 

template <template <class> class TT, class T> 
void foo(tag<TT> a, T b){ foo_impl<TT>(a, b); } 

を、これは示している(非規範的)ノートのエイリアステンプレート名は決して推測されないは幾分正確ではありません...

関連する問題