2012-11-30 47 views
5

Tôi gặp sự cố với mẫu mẫu và khấu trừ tham số. Đây là mã:Chức năng mẫu mẫu và khấu trừ tham số

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

Tôi mong đợi điều này chấp nhận giá trị và giá trị, nhưng chỉ hoạt động với giá trị. Quy tắc thu gọn "T & & & = T &" không áp dụng trong trường hợp này?

Tôi cũng có thể khai báo hàm tham chiếu lvalue, nhưng làm cho mã ít đọc được hơn.

Nếu bạn hỏi tại sao tôi cần điều này là sử dụng static_assert để kiểm tra xem T là một lớp cụ thể hay không. Nếu có một cách đơn giản hơn để làm như vậy, tôi sẽ vui lòng thay đổi mã của mình, nhưng tôi muốn biết các mẫu khuôn mẫu có thể sử dụng theo cách này hay không.

Cảm ơn

Trả lời

2

Không giống như typename T, có thể được suy luận là một loại tài liệu tham khảo, template<typename> class T chỉ bao giờ có thể suy ra được một lớp học mẫu, vì vậy T<U> luôn suy luận một loại đối tượng.

Bạn có thể viết hàm của bạn templated trên T sau đó giải nén kiểu mẫu trong 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, "!"); 
} 
Các vấn đề liên quan