質問するログイン新規登録
Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

286閲覧

引数時に使う変数を変える仕組み

apa

総合スコア73

Unreal Engine

Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2025/09/28 12:51

0

0

unrealengineのコードにて不思議なものがあったので確認させていただきたいです

class MYTESTPROJECT_API ATestActor : public AActor { ... UPROPERTY(EditAnywhere) TSubclassOf<AActor> ref;
void ATestActor::BeginPlay() { static int32 spawnnum = 10000; for (int32 i = 0; i < spawnnum; i++) { AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(ref); } }
template< class T > T* SpawnActor( UClass* Class, const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters() ) { return CastChecked<T>(SpawnActor(Class, NULL, NULL, SpawnParameters),ECastCheckedType::NullAllowed); }

SpawnActorですがUClassを引数に取るにも関わらず、TSubclassOfを代入してもエラーをはきません
TSubclassOfクラス内にUClass変数を保持しておりますが関数に渡されたときにTSubclassOfではなくUClassと認識されている理由を知りたいです。

operatorで可能なのかはたまたC++にそういう機能はなくてエンジン独自のシステムなのか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私は UnrealEngine については知識がないことはあらかじめお断りしておきます。 以下は少なくとも C++ の機能で可能である (実際にそう実装されているかはわからない) という説明です。

実引数と仮引数の型が食い違う場合には暗黙に型変換されることがあります。 オーバーロード解決のルールと絡み合うので正確なルールは大変に複雑なのですが、基本型の特別扱いを除けば変換に使われうるのは

  • 変換コンストラクタ
  • 変換演算子 (cast operator)
  • 継承関係

のいずれかです。

ポインタに変換コンストラクタをユーザ定義することは出来ないのでありえませんし、継承関係を持つこともありえません。 故に変換演算子のオーバーロードで実現しているものと思われます。

簡素化した例で示すと以下のような要領です。

cpp

1struct foo { 2 // 変換演算子のオーバーロード 3 operator int*(void) { 4 return 0; 5 } 6}; 7 8void bar(int*) {} 9 10int main(void) { 11 foo x; // x の型は foo 12 bar(x); // bar は int* を受け取るはずだが foo を渡しても良い。 暗黙に変換される 13}

投稿2025/09/28 15:29

SaitoAtsushi

総合スコア5766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2025/10/04 11:42

なるほどポインタもオペレーターの機能があるんですね 再度調べたところ下記の関数が見つかりましたのでおそらくこれが呼ばれているのだと推測できました ありがとうございます! /** Dereference back into a UClass*, does runtime type checking. */ [[nodiscard]] FORCEINLINE UClass* operator*() const { if (!Class || !Class->IsChildOf(T::StaticClass())) { return nullptr; } return Class; }
apa

2025/10/04 11:45

foo xがポインタじゃないのに barに渡したとき暗黙型変換されて型が違うというエラーが出るわけでもなく ポインタの部分だけ最初に確認されてオペレーター処理に入るのはなんとも不思議ですね
SaitoAtsushi

2025/10/04 19:46

operator* の定義は * 演算子のオーバーロードであって型変換演算子ではないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問