web-dev-qa-db-ja.com

shared_ptr全体のdynamic_cast?

AとBの2つのクラスがあり、BはAから継承します。

本当にBサブタイプであることがわかっているshared_ptr<A>オブジェクトがある場合、動的キャストを実行してBのAPIにアクセスするにはどうすればよいですか(オブジェクトはAだけでなくshared_ptrであることに注意してください)。

18
mezamorphic

Bから関数を呼び出したいだけの場合は、次のいずれかを使用できます。

std::shared_ptr<A> ap = ...;
dynamic_cast<B&>(*ap).b_function();
if (B* bp = dynamic_cast<B*>(ap.get()) {
    ...
}

実際にstd::shared_ptr<B>からstd::shared_ptr<A>を取得したい場合は、次を使用できます。

std::shared_ptr<B> bp = std::dynamic_pointer_cast<B>(ap);
41
Dietmar Kühl

使用する - dynamic_pointer_cast

上記のリンクからコピーした例

// static_pointer_cast example
#include <iostream>
#include <memory>

struct A {
  static const char* static_type;
  const char* dynamic_type;
  A() { dynamic_type = static_type; }
};
struct B: A {
  static const char* static_type;
  B() { dynamic_type = static_type; }
};

const char* A::static_type = "class A";
const char* B::static_type = "class B";

int main () {
  std::shared_ptr<A> foo;
  std::shared_ptr<B> bar;

  bar = std::make_shared<B>();

  foo = std::dynamic_pointer_cast<A>(bar);

  std::cout << "foo's static  type: " << foo->static_type << '\n';
  std::cout << "foo's dynamic type: " << foo->dynamic_type << '\n';
  std::cout << "bar's static  type: " << bar->static_type << '\n';
  std::cout << "bar's dynamic type: " << bar->dynamic_type << '\n';

  return 0;
}

出力

foo's static  type: class A
foo's dynamic type: class B
bar's static  type: class B
bar's dynamic type: class B
8
Bryan Chen

おそらく最も良い方法は、 標準関数を使用shared_ptrをキャストすることです。

1
CoffeeandCode