Với GCC 4.8.0 được phát hành, chúng tôi có một trình biên dịch hỗ trợ khấu trừ kiểu trả về tự động, một phần của C ++ 14. Với -std=c++1y
, tôi có thể làm điều này:
auto foo() { //deduced to be int
return 5;
}
Câu hỏi của tôi là: Khi nào tôi nên sử dụng tính năng này? Khi nào cần thiết và khi nào nó làm cho mã sạch hơn?
cảnh 1
Kịch bản đầu tiên tôi có thể nghĩ đến là bất cứ khi nào có thể. Mỗi chức năng có thể được viết theo cách này nên được. Vấn đề với điều này là nó có thể không phải lúc nào cũng làm cho mã dễ đọc hơn.
Kịch bản 2
Kịch bản tiếp theo là để tránh các loại trả lại phức tạp hơn. Như một ví dụ rất nhẹ:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
Tôi không tin rằng đó thực sự sẽ là một vấn đề, mặc dù tôi đoán rằng kiểu trả về rõ ràng phụ thuộc vào các tham số có thể rõ ràng hơn trong một số trường hợp.
Kịch bản 3
Tiếp theo, để ngăn chặn sự dư thừa:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
Trong C ++ 11, đôi khi chúng ta có thể chỉ return {5, 6, 7};
thay thế một vectơ, nhưng điều đó không phải lúc nào cũng hoạt động và chúng ta cần chỉ định loại trong cả tiêu đề hàm và thân hàm. Điều này hoàn toàn là dự phòng, và khấu trừ kiểu trả về tự động giúp chúng tôi tránh khỏi sự dư thừa đó.
Kịch bản 4
Cuối cùng, nó có thể được sử dụng thay cho các chức năng rất đơn giản:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
Tuy nhiên, đôi khi, chúng ta có thể nhìn vào hàm, muốn biết loại chính xác và nếu nó không được cung cấp ở đó, chúng ta phải đi đến một điểm khác trong mã, như nơi pos_
được khai báo.
Phần kết luận
Với những kịch bản được đặt ra, cái nào trong số chúng thực sự chứng minh là một tình huống trong đó tính năng này hữu ích trong việc làm cho mã sạch hơn? Điều gì về các kịch bản tôi đã bỏ qua để đề cập ở đây? Tôi nên thực hiện các biện pháp phòng ngừa nào trước khi sử dụng tính năng này để nó không cắn tôi sau này? Có bất cứ điều gì mới mà tính năng này mang đến cho bảng mà không thể có nếu không có nó?
Lưu ý rằng nhiều câu hỏi có nghĩa là một trợ giúp trong việc tìm kiếm quan điểm để từ đó trả lời câu hỏi này.
->decltype(t+u)
bằng suy luận tự động sẽ giết chết SFINAE.