shared_ptr
파생 유형을 shared_ptr
기본 유형 을 취하는 함수 에 전달하는 가장 좋은 방법은 무엇입니까 ?
나는 일반적으로 shared_ptr
불필요한 사본을 피하기 위해 s를 참조로 전달합니다 .
int foo(const shared_ptr<bar>& ptr);
하지만 다음과 같은 작업을 시도하면 작동하지 않습니다.
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
나는 사용할 수있다
foo(dynamic_pointer_cast<Base, Derived>(bar));
그러나 이것은 두 가지 이유로 차선책으로 보입니다.
- A
dynamic_cast
는 단순한 파생에서 기본 캐스트에 대해 약간 과도하게 보입니다. - 내가 이해했듯이
dynamic_pointer_cast
함수에 전달할 포인터의 복사본 (임시적이긴하지만)을 만듭니다.
더 나은 해결책이 있습니까?
후손을위한 업데이트 :
누락 된 헤더 파일 문제로 판명되었습니다. 또한 여기서 제가하려는 것은 반 패턴으로 간주됩니다. 일반적으로,
객체의 수명에 영향을주지 않는 함수 (즉, 객체가 함수 기간 동안 유효 함)는 일반 참조 또는 포인터를 가져야합니다 (예 :
int foo(bar& b)
.객체 를 소비 하는 함수 (즉, 주어진 객체의 최종 사용자)는
unique_ptr
값 (예 :)을 가져야합니다int foo(unique_ptr<bar> b)
. 호출자는std::move
함수에 값을 입력해야합니다.객체의 수명을 연장하는 함수는
shared_ptr
예를 들어int foo(shared_ptr<bar> b)
. 순환 참조 를 피하기위한 일반적인 조언이 적용됩니다.
자세한 내용은 Herb Sutter의 Back to Basics 토크 를 참조하십시오.
shared_ptr
입니까? bar의 const 참조가없는 이유는 무엇입니까?