2017-03-27 18 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

Ý nghĩa chính xác của điều đó là gì? Tôi cần một số trợ giúp ~Ý nghĩa của `struct decay <T, R (A ..., ...)>`

+1

Bạn thấy mã đó ở đâu? Nó trông giống như những gì ai đó sẽ sử dụng hợp lý để thực hiện 'std :: decay', nhưng không có lý do gì cho' T' ... Giả định đầu tiên của tôi là bạn đã sao chép nó sai. – Yakk

+0

@Yakk: Mã này là từ boost :: hana. –

+1

Aha: http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html đó là tối ưu hóa. Điều này giải thích về thiết kế vô nghĩa khác; họ đang làm việc xung quanh sự không hiệu quả của mẫu instantiation. – Yakk

Trả lời

7
int foo(int); 
int bar(int, ...); 

đây là hai chức năng khác nhau. foo thuộc loại int(int). bar thuộc loại int(int,...).

... là kiểu chữ V, không được nhầm lẫn với đối số mẫu biến thiên cũng sử dụng ....

template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

này một phần của một thực hiện một phiên bản tối ưu hóa của std::decay trong boost::hana. Các phần typename TT là các chuỗi màu đỏ, một phần của tối ưu hóa đó.

Đây là chuyên môn phù hợp với R(A..., ...), trong đó A...R được suy ra từ chữ ký hàm.

Nếu bạn thông qua double(int, char, ...) như là đối số thứ 2 để hana::details::decay này, R sẽ doubleA... sẽ int, char. Và ... sẽ "khớp với các biến thể kiểu C".

Mục đích của chuyên môn cụ thể này là để ánh xạ các chữ ký chức năng kết thúc bằng varargs kiểu C cho con trỏ đến cùng một chữ ký. Vì vậy, nó ánh xạ double(int, char, ...) đến double(*)(int, char, ...).

Biến thể kiểu C không giống với đối số biến thể mẫu. Họ ăn thịt nó.

+0

Cảm ơn rất nhiều. Đó là điều tôi muốn biết. –

6

Chuyên môn hóa này là một trong những chuyên môn ban hành phân rã của loại hàm thành loại con trỏ-to-chức năng tương ứng, phản ánh cách hàm phân rã phân rã thành hàm giá trị con trỏ.

Chuyên môn cụ thể này được sử dụng cho các hàm đối số biến (những người có danh sách tham số kết thúc bằng dấu ba chấm để nó chấp nhận đối số không khớp với bất kỳ tham số nào).

+0

Tôi không hiểu tại sao sẽ có một hai đối số 'phân rã' cho mục đích đó. – Yakk

+1

'mẫu struct decay {using type = R (*) (A ..., ...); }; 'là một chuyên môn của' phân rã' để bắt các chữ ký chức năng của một kiểu cụ thể. Tôi không hiểu tại sao bạn lại có một phiên bản phân rã hai đối số, sau đó bỏ qua đối số đầu tiên. – Yakk

+0

@KerrekSB: Tôi hoàn toàn không hiểu những gì bạn đã nói, bạn có thể giải thích thêm không? –

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