了解不相关类型的用户定义转换
Understanding User-Defined Conversions for Unrelated Types
我有一个 class、UDataChunk
,它是我所有数据类型(演员信息,如位置、统计信息等)的包装器 class。UDataChunk
持有一个 Value()
方法,该方法被派生的 classes 隐藏,以便 return 它们持有的类型(因为它们持有的数据类型可能会有所不同,我相信这意味着我不应该使用UDataChunk
? 上的模板。
我有一个接口,IDataMapInterface
,它适用于任何可以容纳 Map<TSubclassOf<UDataChunk>, UDataChunk*>
的 class(在 Unreal Engine 中,我相信 TSubclassOf
相当于 std::is_base_of
)。这里的模板方法是TObjectPtr<T> DataChunk()
.
目前,为了获得我需要的正确数据,我调用了 DataChunk<DataChunkDerivedClass>()->Value()
这是隐藏的方法,return 是我实际想要使用的正确数据类型(例如演员指针、整数、向量等)。
我正在进行重构,想知道是否可以进行运算符重载,将 TObjectPtr<T> DataChunk()
隐式转换为其持有的值类型?
class USenseComponent;
UCLASS(BlueprintType, EditInlineNew)
class USenseComponentChunk : public UActorComponentChunk
{
GENERATED_BODY()
public:
USenseComponentChunk()
{
}
TObjectPtr<USenseComponent> Value() const { return Cast<USenseComponent>(component.Get()); } //Component is a UActorComponent*, which USenseComponent derives from
operator TObjectPtr<USenseComponent>() const { return Cast<USenseComponent>(component.Get()); } //Component is a UActorComponent*, which USenseComponent derives from
operator USenseComponent*() const { return Cast<USenseComponent>(component.Get()); }
};
据我了解,USenseComponentChunk*
应该在TObjectPtr<USenseComponent> comp = DataChunk<USenseComponentChunk>();
这样的情况下隐式转换,但我收到错误消息:
No User-Defined Conversion
我还尝试通过 USenseComponent* comp = DataChunk<USenseComponentChunk>().Get()
尝试进一步掌握用户定义的转换,其中 .Get()
returns USenseComponentChunk*
,这会导致错误:
A Value of type USenseComponentChunk* cannot be used to initialize Type USenseComponent*
那么,我误解了什么,或者完全遗漏了什么?
在第一种情况下,您试图将 TObjectPtr<USenseComponentChunk>
对象分配给 TObjectPtr<USenseComponent>
对象。为此目的,您的转换运算符是在 USenseComponentChunk
中实现的,而不是在 TObjectPtr
中实现的。因此,除非 TObjectPtr<T>
使用 CRTP 从 T
派生,否则编译器会导致转换失败。
在第二种情况下,您试图将指针类型 USenseComponentChunk*
分配给不相关的指针类型 USenseComponent*
。因此,编译器使此转换失败也是正确的。由于转换运算符适用于对象,而不是指针,因此您必须取消引用 USenseComponentChunk*
指针,以便编译器在 USenseComponentChunk
对象上调用 USenseComponent*
转换运算符,例如:
USenseComponent* comp = *(DataChunk<USenseComponentChunk>().Get());
我有一个 class、UDataChunk
,它是我所有数据类型(演员信息,如位置、统计信息等)的包装器 class。UDataChunk
持有一个 Value()
方法,该方法被派生的 classes 隐藏,以便 return 它们持有的类型(因为它们持有的数据类型可能会有所不同,我相信这意味着我不应该使用UDataChunk
? 上的模板。
我有一个接口,IDataMapInterface
,它适用于任何可以容纳 Map<TSubclassOf<UDataChunk>, UDataChunk*>
的 class(在 Unreal Engine 中,我相信 TSubclassOf
相当于 std::is_base_of
)。这里的模板方法是TObjectPtr<T> DataChunk()
.
目前,为了获得我需要的正确数据,我调用了 DataChunk<DataChunkDerivedClass>()->Value()
这是隐藏的方法,return 是我实际想要使用的正确数据类型(例如演员指针、整数、向量等)。
我正在进行重构,想知道是否可以进行运算符重载,将 TObjectPtr<T> DataChunk()
隐式转换为其持有的值类型?
class USenseComponent;
UCLASS(BlueprintType, EditInlineNew)
class USenseComponentChunk : public UActorComponentChunk
{
GENERATED_BODY()
public:
USenseComponentChunk()
{
}
TObjectPtr<USenseComponent> Value() const { return Cast<USenseComponent>(component.Get()); } //Component is a UActorComponent*, which USenseComponent derives from
operator TObjectPtr<USenseComponent>() const { return Cast<USenseComponent>(component.Get()); } //Component is a UActorComponent*, which USenseComponent derives from
operator USenseComponent*() const { return Cast<USenseComponent>(component.Get()); }
};
据我了解,USenseComponentChunk*
应该在TObjectPtr<USenseComponent> comp = DataChunk<USenseComponentChunk>();
这样的情况下隐式转换,但我收到错误消息:
No User-Defined Conversion
我还尝试通过 USenseComponent* comp = DataChunk<USenseComponentChunk>().Get()
尝试进一步掌握用户定义的转换,其中 .Get()
returns USenseComponentChunk*
,这会导致错误:
A Value of type USenseComponentChunk* cannot be used to initialize Type USenseComponent*
那么,我误解了什么,或者完全遗漏了什么?
在第一种情况下,您试图将 TObjectPtr<USenseComponentChunk>
对象分配给 TObjectPtr<USenseComponent>
对象。为此目的,您的转换运算符是在 USenseComponentChunk
中实现的,而不是在 TObjectPtr
中实现的。因此,除非 TObjectPtr<T>
使用 CRTP 从 T
派生,否则编译器会导致转换失败。
在第二种情况下,您试图将指针类型 USenseComponentChunk*
分配给不相关的指针类型 USenseComponent*
。因此,编译器使此转换失败也是正确的。由于转换运算符适用于对象,而不是指针,因此您必须取消引用 USenseComponentChunk*
指针,以便编译器在 USenseComponentChunk
对象上调用 USenseComponent*
转换运算符,例如:
USenseComponent* comp = *(DataChunk<USenseComponentChunk>().Get());