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