我的班级里有一个模板成员,我想知道这个成员的类是否继承自特定的类。
class BaseClass;
template <typename T>
class MyClass
{
T* my_member;
public:
void function()
{
BaseClass * base = dynamic_cast<BaseClass*>(my_member)
if(base != 0)
{
// DO SOMETHING
}
else
{
// DO SOMETHING ELSE
}
}
};
我知道如果my_member
的类不是多态的,那么dynamic_cast不会编译,但是我对模板类没有控制权,它可以是多态类型的(我正在编写一个库和我的用户)可以使用他们喜欢的任何课程
没有人有想法以编译T是否是多态的方式来实现它吗?
感谢您的任何想法
答案 0 :(得分:0)
我相信is_polymorphic Boost type trait就是你要找的那个。如果有更适合该任务的那个,您可能还需要查看the other type traits。但要注意,其中很多都是未实现的,请务必查看文档。
答案 1 :(得分:0)
我知道这个问题很旧,但是我遇到了一个相同的问题,即我有一个类型T不知道的通用类(库使用),结果T可能是或不是多态的,但我需要使用dynamic_cast
来实现某些行为。
我不确定这是否是最好的解决方案,但是我能够编写一个“通用”动态类型转换,并使用SFINAE(https://en.cppreference.com/w/cpp/language/sfinae)根据T进行不同的编译
template<typename U>
class Cast
{
public:
template<typename T>
static inline U dynamic(T *iPtr, typename std::enable_if<!std::is_polymorphic<T>::value>::type * = nullptr)
{
return nullptr;
}
template<typename T>
static inline U dynamic(T *iPtr, typename std::enable_if<std::is_polymorphic<T>::value>::type * = nullptr)
{
return dynamic_cast<U>(iPtr);
}
};
因此对于您的特定示例,它变为
void function()
{
BaseClass * base = Cast<BaseClass *>::dynamic(my_member);
if(base != 0)
{
// DO SOMETHING
}
else
{
// DO SOMETHING ELSE
}
}