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

初めて見たコードだったので、理解するために調べることにしました。
型消去とは
簡単に言うと、「C++で 異なる型を統一的に扱う ためのテクニック」らしいです。
詳しくは調べてみてください。
今回のコードでは、
std::shared_ptr<void>
この# 初めに
これは、私がECSについて学ぶ上で、疑問に思った型消去についてのメモです。
間違いがあるかもしれないので、この記事を鵜呑みにはしないようお願いします。
動機
私が疑問に思ったコードは以下の通りです。

初めて見たコードだったので、理解するために調べることにしました。
型消去とは
簡単に言うと、「C++で 異なる型を統一的に扱う ためのテクニック」らしいです。
詳しくは調べてみてください。
実装の解説
今回のコードでは、
std::shared_ptr<void>
このコードで型消去を実現しています。
ECSのような、「型の異なるコンポーネントを同じマップで扱いたい」場合に適しています。
ただし、voidは中身が見えないため、使用する際はキャストする必要があります。
std::static_pointer_cast<TempClass<T>>(it);
注意点
shared_ptrは型安全ではないため、キャスト先を間違えると未定義動作のリスクがあります。
またコンパイル時に型チェックされないため、ランタイムエラーになることもあります。
そのため、必ず型情報がわかっている状態で使うことが前提です。
まとめ
・std::shared_ptrは「どんな方のオブジェクトでも格納できるスマートポインタ」
・ESCでは型ごとのコンポーネントの配列を1つのマップで管理するために使われる
・取り出すときは、元の方にキャストして使用する
・型安全は失われるので、使う側が正しい保証をする必要がある