0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初めに

 これは、私がECSについて学ぶ上で、疑問に思った型消去についてのメモです。
 間違いがあるかもしれないので、この記事を鵜呑みにはしないようお願いします。

動機

 私が疑問に思ったコードは以下の通りです。
image.png
 初めて見たコードだったので、理解するために調べることにしました。

型消去とは

簡単に言うと、「C++で 異なる型を統一的に扱う ためのテクニック」らしいです。
詳しくは調べてみてください。

今回のコードでは、

std::shared_ptr<void>

この# 初めに
 これは、私がECSについて学ぶ上で、疑問に思った型消去についてのメモです。
 間違いがあるかもしれないので、この記事を鵜呑みにはしないようお願いします。

動機

 私が疑問に思ったコードは以下の通りです。
image.png
 初めて見たコードだったので、理解するために調べることにしました。

型消去とは

簡単に言うと、「C++で 異なる型を統一的に扱う ためのテクニック」らしいです。
詳しくは調べてみてください。

実装の解説

今回のコードでは、

std::shared_ptr<void>

このコードで型消去を実現しています。
ECSのような、「型の異なるコンポーネントを同じマップで扱いたい」場合に適しています。

ただし、voidは中身が見えないため、使用する際はキャストする必要があります。

std::static_pointer_cast<TempClass<T>>(it);

注意点

shared_ptrは型安全ではないため、キャスト先を間違えると未定義動作のリスクがあります。
またコンパイル時に型チェックされないため、ランタイムエラーになることもあります。
そのため、必ず型情報がわかっている状態で使うことが前提です。

まとめ

・std::shared_ptrは「どんな方のオブジェクトでも格納できるスマートポインタ」
・ESCでは型ごとのコンポーネントの配列を1つのマップで管理するために使われる
・取り出すときは、元の方にキャストして使用する
・型安全は失われるので、使う側が正しい保証をする必要がある

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?