Trong C ++ 11, có hai cú pháp để khai báo hàm:
khai báo đối số định danh kiểu trả về (
... )
và
auto
(
khai báo đối số định danh ... )
->
return_type
Chúng là tương đương. Bây giờ khi chúng tương đương nhau, tại sao bạn lại muốn sử dụng cái sau? Chà, C ++ 11 đã giới thiệu điều hay ho này decltype
cho phép bạn mô tả loại biểu thức. Vì vậy, bạn có thể muốn lấy ra kiểu trả về từ các kiểu đối số. Vì vậy, bạn hãy thử:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
và trình biên dịch sẽ cho bạn biết rằng nó không biết những gì a
và b
trong decltype
đối số. Đó là bởi vì chúng chỉ được khai báo bởi danh sách đối số.
Bạn có thể dễ dàng giải quyết vấn đề bằng cách sử dụng declval
và các tham số mẫu đã được khai báo. Giống:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
ngoại trừ bây giờ nó thực sự dài dòng. Vì vậy, cú pháp khai báo thay thế đã được đề xuất và thực hiện và bây giờ bạn có thể viết
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
và nó ít dài dòng hơn và các quy tắc phạm vi không cần phải thay đổi.
Cập nhật C ++ 14: C ++ 14 cũng chỉ cho phép
auto
khai báo đối số định danh (
... )
miễn là hàm được xác định đầy đủ trước khi sử dụng và tất cả các return
câu lệnh đều suy ra cùng loại. Các ->
cú pháp vẫn còn hữu ích cho các chức năng công cộng (công bố trong tiêu đề) nếu bạn muốn ẩn cơ thể trong tập tin nguồn. Một số thứ rõ ràng không thể được thực hiện với các mẫu, nhưng có một số loại cụ thể (thường được bắt nguồn qua siêu lập trình mẫu) rất khó để viết khác.