了解不相关类型的用户定义转换

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> 使用 CRTPT 派生,否则编译器会导致转换失败。

在第二种情况下,您试图将指针类型 USenseComponentChunk* 分配给不相关的指针类型 USenseComponent*。因此,编译器使此转换失败也是正确的。由于转换运算符适用于对象,而不是指针,因此您必须取消引用 USenseComponentChunk* 指针,以便编译器在 USenseComponentChunk 对象上调用 USenseComponent* 转换运算符,例如:

USenseComponent* comp = *(DataChunk<USenseComponentChunk>().Get());