0

我的类中有一个模板成员,我想知道该成员的类是否继承自特定类。

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
        }
    }  
};

我知道如果类不是多态的,dynamic_cast 不会编译,my_member但我无法控制模板类它可以是多态类型或不是多态类型(我正在编写一个库,我的用户可以使用他们想要的任何类)。
没有人知道以编译 T 是否为多态的方式来实现这一点吗?感谢您的任何想法

4

2 回答 2

0

我相信is_polymorphic Boost 类型特征是您正在寻找的特征。如果有更适合该任务的特征,您可能还想查看其他类型特征。但请注意,其中很多都未实现,请务必查看文档。

于 2011-06-30T22:42:29.117 回答
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
    }
}  
于 2018-11-17T17:22:27.390 回答