From David Callu, " bug:
Lost the functionality to find the real type pointed by a pointer.
Ex: a osg::Node pointer point on a osg::Group, if I look for information
on the pointer type, the introspection say it is a "osg::Node*".
But if I want information on the pointed type,
the introspection must return the "osg::Group".
This bug come from the osgIntrospection::Value::Ptr_instance_box::ptype() function.
In the original version, this function use the member "Instance_base *inst_"
like this :
typeof(*static_cast<Instance<T> *>(inst_)->_data)
But in the new version, this function use the template argument "T":
typeof(typename remove_pointer<T>::type)
This is a good meta-programming use, but here we need a dynamic request.
Moreover the "typeof" macro define in "Reflection" header accept only a type in parameter with the new version.
fix:
Add the macro "typeofvalue" in "Reflection" header which accept a value or a type in parameter.
Restore original code in osgIntrospection::Value::Ptr_instance_box::ptype() function.
"
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
/// returning the Type object associated to the type of the given
|
||||
/// expression.
|
||||
#define typeof(type) osgIntrospection::Reflection::getType(extended_typeid< type >())
|
||||
#define typeofvalue(val) osgIntrospection::Reflection::getType(osgIntrospection::ExtendedTypeInfo(typeid(val), false, false))
|
||||
|
||||
namespace osgIntrospection
|
||||
{
|
||||
|
||||
@@ -303,7 +303,7 @@ namespace osgIntrospection
|
||||
virtual const Type* ptype() const
|
||||
{
|
||||
if (!static_cast<Instance<T> *>(inst_)->_data) return 0;
|
||||
return &typeof(typename remove_pointer<T>::type);
|
||||
return &typeofvalue(*static_cast<Instance<T> *>(inst_)->_data);
|
||||
}
|
||||
|
||||
virtual bool nullptr() const
|
||||
|
||||
Reference in New Issue
Block a user