【问题标题】:Why is typeid not compile-time constant like sizeof为什么 typeid 不是像 sizeof 这样的编译时常量
【发布时间】:2010-12-31 04:26:54
【问题描述】:

为什么 typeid(someType) 不像 sizeof(someType) 一样是常量?

这个问题出现是因为最近我尝试了类似的东西:

template <class T>
class Foo
{
    static_assert(typeid(T)==typeid(Bar) || typeid(T)==typeid(FooBar));
};

我很好奇为什么编译器在编译时知道类型的大小 (sizeof),但不知道类型本身 (typeid)

【问题讨论】:

    标签: c++


    【解决方案1】:

    当您处理类型时,您宁愿使用简单的元编程技术:

    #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 可能不是编译时的,因为它必须处理运行时多态对象,而这正是您更愿意使用它的地方(如果有的话)。

    【讨论】:

    • 顺便说一句,is_same 是自 C++11 以来标准库的一部分,以及 static_assert
    【解决方案2】:

    C++ 可以处理某些类型的常量(编译时)表达式,但引用类型不属于这些类型。 typeid 表达式的结果是对 std::type_info 对象的引用。

    显然,在 2008 年的一段时间里,C++ 标准委员会有 typeid 表达式,例如您的示例中的表达式,就像 sizeof 一样。然而,根据this comment 的说法,这种变化最终被恢复了。

    【讨论】:

    • 评论链接失效!
    • 我想创建一个 std::type_index 模板或唯一标识一个类的东西。该怎么做?
    【解决方案3】:

    因为typeid 可以灵活地在运行时根据指针或对对象的引用进行查找,所以它不能返回编译时常量。即使看起来可以。 sizeof 没有这样的限制,因为它总是在编译时进行计算。

    【讨论】:

    • 除了 smerlin 询问的是 typeid 的特定用途,而 type id 的这种特定用途进行运行时查找。
    • 运行时常量通常限于整数值。 typeid 返回一个对 type_info 类的引用,这远不止于此。
    • 啊,我忘记了 typeid 也适用于对象......我仍然认为如果可以使用上面的示例来完成它会非常有用。希望 C++0x 支持类似的东西。好吧,至少它会支持静态断言...
    【解决方案4】:

    它在编译时知道类型本身(以它自己的内部语言),但不知道它的类型 id(显然是为运行时创建的)。

    【讨论】:

      【解决方案5】:

      因为typeid需要RTTI,即typeid在运行时执行,BOOST_STATIC_ASSERT在编译时执行。

      更多信息here

      【讨论】:

      • 除了 smerlin 询问 typeid 的特定用途,而 typeid 的这种特定用途不进行运行时查找
      • 我不同意,他的问题是:“为什么 typeid(someType) 不像 sizeof(someType) 那样恒定?”,而不是关于 typeid 的特定用途
      • Coelhudo,“特殊用途”是参数是 type 的那个。 RTTI 仅在参数是对象表达式时使用。
      • 然后RTTI也只在对象表达式是多态类型时使用。换句话说,pair&lt;int, int&gt; p; typeid(p); 不需要 RTTI。
      猜你喜欢
      • 1970-01-01
      • 2011-02-03
      • 2012-10-19
      • 2021-12-17
      • 2011-10-14
      • 2010-12-02
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多