为什么typeid(someType)不像sizeof(someType)那样是常量?
这个问题出现了,因为最近我尝试了类似的事情:
template <class T>
class Foo
{
static_assert(typeid(T)==typeid(Bar) || typeid(T)==typeid(FooBar));
};
我很好奇为什么编译器在编译时知道类型(sizeof)的大小,而不是类型本身(typeid)
答案 0 :(得分:10)
当你处理类型时,你宁愿使用简单的元编程技术:
#include <type_traits>
template <class T>
void Foo()
{
static_assert((std::is_same<T, int>::value || std::is_same<T, double>::value));
}
int main()
{
Foo<int>();
Foo<float>();
}
其中is_same
可以像这样实现:
template <class A, class B>
struct is_same
{
static const bool value = false;
};
template <class A>
struct is_same<A, A>
{
static const bool value = true;
};
typeid
可能不是编译时,因为它必须处理运行时多态对象,而这就是你宁愿使用它的地方(如果有的话)。
答案 1 :(得分:5)
C ++可以处理某些类型的常量(编译时)表达式,但引用类型不属于这些类型。 typeid
表达式的结果是对std::type_info
对象的引用。
显然在2008年,C ++标准委员会有typeid
个表达式,例如你的示例中的表达式表现为常量表达式,就像sizeof
一样。然而,根据this comment,这种变化最终还是已经恢复了。
答案 2 :(得分:2)
因为typeid需要RTTI,即typeid在运行时执行,BOOST_STATIC_ASSERT在编译时执行。
更多信息here。
答案 3 :(得分:1)
因为typeid
可以灵活地根据指针或对象的引用在运行时进行查找,所以它不能返回编译时常量。即使看起来它可以。 sizeof
没有这样的限制,因为它总是在编译时进行计算。
答案 4 :(得分:0)
它在编译时知道类型本身(用它自己的内部语言),但不知道它的类型id(显然是为运行时创建的)。