FProperty: What different with GetPropertyValue() and ContainerPtrToValuePtr()?

I’m trying to make a generic struct to string map node, and met a strange problem.


when I using FProperty->GetPropertyValue(), It got all wrong similar value.


and when I using FProperty->ContainerPtrToValuePtr(), It got all right value.

why?

Despite the apparent similarity in name, FProperty::GetPropertyValue doesn’t perform as expected. Internally, it simply invokes:

/** Convert the address of a value of the property to the proper type */
static FORCEINLINE TCppType const* GetPropertyValuePtr(void const* A)
{
	return (TCppType const*)A;
}

This snippet essentially takes your ValuePtr pointer and converts it to the specified type (in your case, float). However, if ValuePtr is a struct and you attempt to convert it to a float (when it’s not), it retrieves the first member variable in the struct’s layout, resulting in a consistent return value regardless of input. This function truly needs either a clearer name or more detailed documentation.

Moving on to FProperty::ContainerPtrToValuePtr, it indeed accomplishes the intended task of extracting the property from the struct. Internally, it conducts a simple struct member pointer offset operation, resembling something like return (uint8*)ValuePtr + MemberVariableOffset;

Thanks for your replay. The func name has indeed caused me trouble.

1 Like

Correct way to get the value of a Property?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.