检查可以是非多态类型的Template类的强制转换(作为dynamic_cast)

时间:2011-06-28 10:12:52

标签: casting polymorphism dynamic-cast

我的班级里有一个模板成员,我想知道这个成员的类是否继承自特定的类。

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是否是多态的方式来实现它吗? 感谢您的任何想法

2 个答案:

答案 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
    }
}