get_component_type_id<BaseClass> get_component_type_id<ChildClass> - . , static size_t uniqueComponentId, .
OP
Yes it is possible. You can use:
template <typename T>
inline std::size_t get_component_type_id(T*, std::false_type) noexcept
{
static size_t uniqueComponentId{__INTERNAL__::getUniqueComponentId()};
return uniqueComponentId;
}
inline std::size_t get_component_type_id(BaseClass*, std::true_type) noexcept
{
static size_t uniqueComponentId{__INTERNAL__::getUniqueComponentId()};
return uniqueComponentId;
}
template<typename T>
inline std::size_t get_component_type_id() noexcept
{
static_assert(std::is_base_of<Component, T>::value, "T must be of type Component.");
return get_component_type_id((T*)nullptr, typename std::is_convertible<T, BaseClass>::type{});
}
However, it is fragile. If you want to have the same behavior for another class derived from Component, you will need to make significant changes.
You will be better off using the member function virtual.
struct Component
{
virtual size_t get_type_id() const = 0;
};
struct BaseClass : Component
{
size_t get_type_id() const
{
static size_t uniqueComponentId{__INTERNAL__::getUniqueComponentId()};
return uniqueComponentId;
}
};
struct ChildClass : BaseClass {};
Now you can implement size_t get_type_id() constinheritance hierarchy at any level at your discretion.
source
share