如果类型是多态的,如何在编译时检查

时间:2014-09-09 14:36:03

标签: c++ templates compile-time

我有模板功能。在模板函数中,我在模板参数上使用dynamic_cast。但由于你不能在非多态类型上使用dynamic_cast,我想在编译时检查类型是否是多态的(至少有一个虚函数),如果type不是多态的,我将跳过使用dynamic_cast。这可能吗 ?

2 个答案:

答案 0 :(得分:8)

您可以使用std::is_polymorphic

struct Foo {};

std::cout << std::is_polymorphic<Foo>::value << std::endl;

您可以将此项与std::enable_if结合使用,以根据其值使用不同的代码。

答案 1 :(得分:2)

与@juanchopanza相比的另一种方式

template<class T>
struct IsPolymorphic
{
    struct Derived : T {
        virtual ~Derived();
    };
    enum  { value = sizeof(Derived)==sizeof(T) };
};

class PolyBase {
public:   
    virtual ~PolyBase(){}
};

class NPolyBase {
public:
    ~NPolyBase(){}
};

void ff()
{
    std::cout << IsPolymorphic<PolyBase >::value << std::endl;
    std::cout << IsPolymorphic<NPolyBase>::value << std::endl;
}