Phương pháp tốt nhất để chuyển một shared_ptr
kiểu dẫn xuất sang một hàm nhận shared_ptr
kiểu cơ sở là gì?
Tôi thường chuyển shared_ptr
s bằng cách tham khảo để tránh một bản sao không cần thiết:
int foo(const shared_ptr<bar>& ptr);
nhưng điều này không hiệu quả nếu tôi cố gắng làm điều gì đó như
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
tôi có thể dùng
foo(dynamic_pointer_cast<Base, Derived>(bar));
nhưng điều này có vẻ không tối ưu vì hai lý do:
- A
dynamic_cast
có vẻ hơi thừa đối với một dàn diễn viên đơn giản có nguồn gốc từ cơ sở. - Theo tôi hiểu, hãy
dynamic_pointer_cast
tạo một bản sao (mặc dù là bản sao tạm thời) của con trỏ để chuyển tới hàm.
Có giải pháp nào tốt hơn không?
Cập nhật cho hậu thế:
Hóa ra là vấn đề thiếu tệp tiêu đề. Ngoài ra, những gì tôi đang cố gắng làm ở đây được coi là một phản vật chất. Nói chung là,
Chức năng mà không ảnh hưởng đến tuổi thọ của một đối tượng (tức là đối tượng vẫn có giá trị trong suốt thời gian của hàm) nên phải mất một tài liệu tham khảo đồng bằng hoặc con trỏ, ví dụ
int foo(bar& b)
.Các hàm sử dụng một đối tượng (tức là những người dùng cuối cùng của một đối tượng nhất định) phải nhận
unique_ptr
theo giá trị, ví dụint foo(unique_ptr<bar> b)
. Người gọi nênstd::move
nhập giá trị vào hàm.Các hàm kéo dài thời gian tồn tại của một đối tượng phải nhận
shared_ptr
theo giá trị, ví dụint foo(shared_ptr<bar> b)
. Lời khuyên thông thường để tránh các tham chiếu vòng tròn được áp dụng.
Xem bài nói chuyện Back to Basics của Herb Sutter để biết thêm chi tiết.
shared_ptr
? Tại sao không có tham chiếu const của thanh?