2011-06-05 24 views
13

Tôi chỉ muốn biết nếu đã có một tiêu chuẩn được cung cấp. Tôi biết đó là dễ dàng để làm một mìnhCó loại đặc điểm nào để loại bỏ cv và tham chiếu cấp cao cùng một lúc không?

// for C++03, use <tr1/type_traits> and std::tr1 
#include <type_traits> 

template<class T> 
struct remove_toplevel{ 
    typedef typename std::remove_reference<T>::type noref_T; 
    typedef typename std::remove_cv<noref_T>::type noref_nocv_T; 
    typedef noref_nocv_T type; 
}; 

nhưng tôi nghĩ rằng tôi đã quên một cái gì đó trong đó hoặc có thứ tự sai, vì vậy nó sẽ được tốt đẹp để có một chuẩn bị, nếu có.

+1

Bạn có lẽ có ý định áp dụng 'remove_cv' vào' noref_T', không dùng 'T' như trong đoạn mã trên của bạn. – AnT

+0

@Andrey: Rất tiếc, cảm ơn, là lỗi đánh máy. :) – Xeo

Trả lời

19

std::decay, tôi tin rằng, thực hiện chức năng này.

+0

Tuyệt vời, tôi biết có điều gì đó! Tôi nghĩ 'decay' chỉ dành cho' mảng -> con trỏ'. – Xeo

+0

Thú vị khi biết, câu hỏi hay. Đây là [mô tả MSDN của std :: decay()] (http://msdn.microsoft.com/en-us/library/ee361638.aspx). Bằng cách này, bạn có thể chuỗi tất cả các typedefs của bạn thành một dòng để ít tiết nếu bạn thực sự cần phải xây dựng đặc điểm của riêng bạn. –

+0

@Xeo: Khá chắc chắn rằng đó là chức năng của 'phân rã' để sao chép trích dẫn đối số mẫu, hoặc một cái gì đó tương tự. 'mảng -> con trỏ' là điều duy nhất tôi biết trong tiêu chuẩn được gọi là' phân rã' ngoài việc này mặc dù, do đó, sự nhầm lẫn dễ dàng được thực hiện. – Puppy

2

Tôi thích kết hợp hai chức năng vì nó mô tả chính xác những gì mục đích là:

C++ 11 std::remove_cv<std::remove_reference<T>::type>::type

C++ 14 std::remove_cv_t<std::remove_reference_t<T>>

C++ 20 std::remove_cvref_t<T>

Các vấn đề liên quan