しばらくして、テンプレートの力テンプレートパラメータを再び発見しました。例えば、次のスニペット:テンプレートテンプレートパラメータにエイリアステンプレートを推測して、引き続きそのプロパティを保持しながらコンテキストを推定する方法はありますか?
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{});
}
コンパイラは正しいですTT<T>
パラメータがfoo
であり、int{}
がテンプレートパターンとタイプパラメータパターンと一致しません。 T
の控除コンテキストを保存する方法はありますか?TT
は、コンテキストを非推定としてTT<T>
にしますか?
P.S.私の意図は純粋であり、これはそれの背後にYの問題がない理論的な質問に過ぎない。
正直に私はどちらも最初の_beautifulneを見ることはできません2回目の試行には使用できません。とにかく質問は興味深いです、+1。 – skypjack
@skypjack私が言ったように、私は考えられる可能性についても考えていないので、あなたは正しいかもしれません... –