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 ..., ...)>`
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 ..., ...)>`
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 T
và T
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...
và 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ẽ double
và A...
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ó.
Cảm ơn rất nhiều. Đó là điều tôi muốn biết. –
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).
Tôi không hiểu tại sao sẽ có một hai đối số 'phân rã' cho mục đích đó. – Yakk
'mẫu
@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? –
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
@Yakk: Mã này là từ boost :: hana. –
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