2012-11-30 8 views
5

テンプレートテンプレートとパラメーターの差し引きに問題があります。ここでは、コードです:テンプレートテンプレート関数とパラメーターの差し引き

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

私は、これは左辺値と右辺値のいずれかを受け入れるように期待が、唯一の右辺値で動作します。この場合、折りたたみ規則 "T & & & = T &"は適用されません。

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

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

おかげtemplate<typename> class Tがしかクラステンプレートであることを推測することができ、参照型であることを推論することができるので、T<U>は常にオブジェクト型に推定されるtypename Tとは異なり

答えて

2

あなたはその後、static_assertでテンプレートの種類を解凍Tにテンプレートあなたの関数を書くことができます。

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, "!"); 
} 
関連する問題