5

テンプレートテンプレートとパラメータの推定に問題があります。コードは次のとおりです。

template<typename U, template<typename> class T>
void test(T<U>&& t)
{
  ...
}

私はこれが左辺値と右辺値のどちらかを受け入れることを期待していましたが、右辺値でのみ機能します。この場合、折りたたみルール「T &&& = T&」は適用されませんか?

当然、左辺値参照関数も宣言できますが、コードが読みにくくなります。

なぜこれが必要なのかを尋ねる場合は、static_assertを使用してTが特定のクラスであるかどうかを確認することです。もっと簡単な方法があれば、コードを変更させていただきますが、テンプレートテンプレートがこのように使用できるかどうかを知りたいと思います。

ありがとう

4

1 に答える 1

3

typename T参照型であると推定できるとは異なり、template<typename> class Tクラステンプレートであると推定できるのT<U>は、常にオブジェクト型であると推定されるためです。

テンプレート化された関数を記述してから、 :Tでテンプレートタイプを解凍できます。static_assert

template<typename T> struct is_particular_class: std::false_type {};
template<typename U> struct is_particular_class<ParticularClass<U>>: std::true_type {};

template<typename T> void test(T &&) {
  static_assert(is_particular_class<std::remove_reference<T>::type>::value, "!");
}
于 2012-11-30T17:13:19.450 に答える