Giả sử tôi có chức năng mẫu, assign()
. Phải mất một con trỏ và một giá trị và gán giá trị cho mục tiêu của con trỏ:Sử dụng một đối số để khấu trừ tham số mẫu?
template <typename T> void assign(T *a, T b) { *a = b; }
int main() {
double i;
assign(&i, 2);
}
Trong trường hợp này tôi luôn muốn T
được rút ra từ những số đầu tiên, nhưng có vẻ như tôi đã không làm một công việc tốt thể hiện điều này. loại 2
‘s là int
, vì vậy:
deduce.cpp:5:5: error: no matching function for call to 'assign' assign(&i, 2); ^~~~~~ deduce.cpp:1:28: note: candidate template ignored: deduced conflicting types for parameter 'T' ('double' vs. 'int') template void assign(T *a, T b) { *a = b; }
Có cách nào tôi có thể tuyên bố assign()
để đối số thứ hai không tham gia vào khấu trừ tham số mẫu?
Vì vậy, một vấn đề ở trên không hiệu quả. Giả sử 'T' là' std :: vector'. Đối số 'b' được lấy theo giá trị, sau đó sao chép (không được di chuyển) vào' a'. Một cải tiến nhỏ có thể thay đổi việc thực hiện 'assign' thành' * a = std :: move (b) ', cho các kiểu nguyên thủy không tốn kém gì, và đối với các kiểu phức tạp có thể tiết kiệm được rất nhiều. Một cải tiến lớn sẽ là hoàn hảo về phía trước 'b'. – Yakk
@Yakk Hoàn toàn đồng ý - Tôi vừa viết nó như là một ví dụ về một hàm nhận con trỏ và giá trị của cùng một loại. Trong thực tế nó chỉ mất nguyên thủy và hữu ích hơn anh chàng này :). – s4y