2013-05-25 9 views
8

Có mẫu kiểu đặc điểm trả về loại cơ sở của một loại nhất định không. Bởi loại cơ sở Tôi có nghĩa là loại có tất cả các công cụ sửa đổi giá trị, const, dễ bay hơi, v.v ... bị loại bỏ. Ví dụ, sử dụng một đặc điểm chức năng giả:Nhận loại cơ sở của loại mẫu (xóa const/tham chiếu/v.v.)

base<int>::type == int 
base<int const>::type == int 
base<int&>::type == int 

Tôi nhận thức được remove_constremove_reference và hiện đang chỉ sử dụng chúng kết hợp. Tôi tự hỏi nếu tuy nhiên có tồn tại đã có một đặc điểm và có lẽ nếu có một tên thích hợp với những gì tôi đang đề cập?

+2

'typename std :: remove_cv :: type> :: type'? –

+0

@AndyProwl, vâng, đó là những gì tôi làm bây giờ ... Tôi đoán điều đó bao gồm tất cả các cách tham khảo loại. –

Trả lời

10

tôi probaby sẽ xác định một loại bí danh như:

template<typename T> 
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type; 

Thông báo, rằng hereR. Martinho Fernandes đề xuất tên Unqualified cho một loại bí danh như vậy.

Đặc điểm kiểu tiêu chuẩn std::decay, mặt khác thì tương tự như trên một cái gì đó khác cho các loại mảng và chức năng, có thể hoặc không thể là thứ bạn muốn.

+0

Làm thế nào để 'không đủ tiêu chuẩn' so sánh với' std :: common_type' (tôi đã làm [test] (http://coliru.stacked-crooked.com/view?id=b36ef298b0537eb2841c01d881685e7a-8a676986784bd3a58ce3ec015645a41f) nó, ngay cả với [cả hai đặc điểm ] (http://coliru.stacked-crooked.com/view?id=91fd0a114c9d0e6835133fb5062f01c8-8a676986784bd3a58ce3ec015645a41f))? – chris

+0

@chris: Huh, điều đó thật khó hiểu. Có lẽ tôi đang thiếu một cái gì đó, nhưng không phải là tiêu chuẩn xác định rằng 'common_type ' nên được 'T' khi chỉ có một loại đối số? –

+0

Tôi biết nó hoạt động như một mẫu nhận dạng, nhưng từ những gì tôi đã nhìn thấy, tất cả nó loại bỏ là cv và tài liệu tham khảo. Tôi không biết liệu nó có làm điều đó với bất cứ điều gì khác không. – chris

1

Rõ ràng nó phụ thuộc vào chính xác những gì bạn muốn xóa khỏi loại. std::decay có thể là những gì bạn đang tìm kiếm (loại bỏ tham chiếu, const/volatile, phân rã mảng thành con trỏ và hàm thành con trỏ hàm). Nếu bạn không muốn mảng đến con trỏ và hàm bị phân rã chức năng, bạn cần phải gắn bó với std::remove_referencestd::remove_cv (loại bỏ constvolatile). Tất nhiên bạn có thể kết hợp cả hai thành typetrait của riêng bạn để làm cho việc sử dụng nó dễ dàng hơn.

4

thử std::decay. Nó bắt chước những gì xảy ra khi bạn chuyển đối số tới hàm theo giá trị: dải các giá trị cv cấp cao nhất, tham chiếu, chuyển đổi mảng thành con trỏ và hàm thành con trỏ hàm.

Kính trọng, & rzej