fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

PREV | PAGE-SELECT | NEXT

≫ EDIT

UE5/UE4 C++におけるキャスト(Cast)について(Cast、CastChecked)

C++におけるキャスト(Cast)についてです。
ドキュメントを見れば書いてあるのっぽいのですが忘れやすいのでメモということで…。

こちらを参考にさせていただきました。

・Real Unreal Engine C++ 2017-12 (part-1/5)
https://usagi.hatenablog.jp/entry/2017/12/01/ac_ue4_2

キャスト(Cast)についてはこう書かれています。

1.6.1. Cast< T >, CastChecked< T > と dynamic_cast< T > 及び RTTI
UE4 にはライブラリーレベルのキャスト実装として Cast< T > が提供されている。

Cast< T > は dynamic_cast< T > の UE4 版と考えると C++er にとっては理解が速い。
しかし、 Cast< T > についてはムーブセマンティクスのように C++ レベルで提供される機能と
UE4 で提供される機能の何れを使用しても構わないわけでは「ない」ので注意が必要である。

先ず、 UE4 では dynamic_cast< T > は事実上使えない。デフォルトで RTTI は無効化されるからだ。
一般論としては悪役にされる事もままあるダウンキャストを前提とした設計も合理的な理由がある場合、
特にゲーム用途のライブラリーでは有用な事もある。
UE4 でもしばしばダウンキャストは有用に用いられるが、RTTI を前提とした dynamic_cast< T > は
実行時コストのオーバーヘッドが UE4 の目指す低レイテンシーなフレームワークの実装と相容れないため、
UE4 では RTTI を無効化しつつも
独自のリフレクションに基づいた高速で安全なダウンキャスト機能として Cast< T > を提供している。

ということから、UE 側が用意した「Cast< T >」を使うのがよさそうです。

UE4 の Cast< T > は UObject 派生型の型安全なダウンキャストに配慮した実装になっている。
UObject に仕込まれた GetInterfaceAddress / StaticClass から型安全なダウンキャストを判断し、
安全では無い場合には nullptr を返す。

Cast< T > にはエラーログ機能付き版の CastChecked< T > もあり、
DO_CHECK CPPマクロが有効な場合には入力または出力が nullptr
あるいは bool への暗黙的なキャスト結果が fasle となるような場合には
Fatal レベルのエラーログ UE4 のログ機能を通してを出力しつつ停止する。

ほかに、入力が nullptr ではなく入力の GetClass と出力型の StaticClass が operator== 的に一致する場合にのみ
キャストを行い、失敗した場合は nullptr を出力する ExactCast も使用できる

基本的には「Cast< T >」を使い、エラーログ機能などを使いたい場合は「CastChecked< T >」を使うのがよさそうです。

他にもいろいろと書かれているので参考サイトを見るとよいかなと思います。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://kagring.blog.fc2.com/tb.php/683-9db700c9

TRACKBACK

PREV | PAGE-SELECT | NEXT