Qual é o melhor método para passar a shared_ptr
de um tipo derivado para uma função que recebe a shared_ptr
de um tipo base?
Eu geralmente passo shared_ptr
s por referência para evitar uma cópia desnecessária:
int foo(const shared_ptr<bar>& ptr);
mas isso não funciona se eu tentar fazer algo como
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
eu poderia usar
foo(dynamic_pointer_cast<Base, Derived>(bar));
mas isso parece abaixo do ideal por dois motivos:
- A
dynamic_cast
parece um pouco excessivo para um elenco simples de derivado para base. - Pelo que entendi,
dynamic_pointer_cast
cria uma cópia (embora temporária) do ponteiro para passar para a função.
Existe uma solução melhor?
Atualização para a posteridade:
Era um problema de falta de um arquivo de cabeçalho. Além disso, o que eu estava tentando fazer aqui é considerado um antipadrão. Geralmente,
Funções que não afetam a vida útil de um objeto (ou seja, o objeto permanece válido durante a função) devem receber uma referência simples ou ponteiro, por exemplo
int foo(bar& b)
.Funções que consomem um objeto (ou seja, são os usuários finais de um determinado objeto) devem assumir um
unique_ptr
valor por, por exemploint foo(unique_ptr<bar> b)
. Os chamadores devemstd::move
inserir o valor na função.As funções que estendem a vida útil de um objeto devem assumir um
shared_ptr
valor por, por exemploint foo(shared_ptr<bar> b)
. O conselho usual para evitar referências circulares se aplica.
Consulte a palestra de volta ao básico de Herb Sutter para obter detalhes.
shared_ptr
? Por que nenhuma referência constante da barra?