C++11 type_traits如何在编译时知道关于多态性的所有信息

C++11 type_traits如何在编译时知道关于多态性的所有信息,c++11,polymorphism,runtime,typetraits,compile-time,C++11,Polymorphism,Runtime,Typetraits,Compile Time,我正在学习如何使用C++11使用type\u traits,我听说type\u traits在编译时工作 我真的很惊讶。我做了如下测试: class A {virtual void foo();}; class B : public A {}; constexpr bool b = std::is_base_of<A, B>::value; constexpr bool bb = std::is_polymorphic<A>::value; constexpr bool

我正在学习如何使用C++11使用
type\u traits
,我听说
type\u traits
在编译时工作

我真的很惊讶。我做了如下测试:

class A {virtual void foo();};
class B : public A {};

constexpr bool b = std::is_base_of<A, B>::value;
constexpr bool bb = std::is_polymorphic<A>::value;
constexpr bool bb2 = std::is_polymorphic<B>::value;

int main()
{
    return 0;
}
好的,
type\u traits
在编译时起作用


但是怎么做呢?还是说C++编译器可以在编译时获得所有的多态信息?我一直认为多态性信息都是关于运行时的东西…

多态类型是一种类型,其实例可以显示多态行为(虚拟函数调用、类型擦除、RTTI等)。行为本身发生在运行时,但这种可能性在编译时就已经知道了——如果只是因为编译器必须生成启用它的内部数据结构(vtables等)

例如,给定两种神秘类型
X
Y

void check(X const &x) {
    if(dynamic_cast<Y *>(&x))
        std::cout << "We have a Y!\n";
}
无效检查(X常量和X){
if(动态_转换(&x))

std::cout对于
A
B
类所示的示例,没有涉及多态性。这一切都归结为模板和模板元编程技术。@Someprogrammerdude好吧,我刚刚做了另一个示例。显示。它仍然由模板处理,模板是编译时构造。@Someprogrammerdu那么哪些类型的信息是运行时信息,哪些不能是
type\u traits
void check(X const &x) {
    if(dynamic_cast<Y *>(&x))
        std::cout << "We have a Y!\n";
}