gpt4 book ai didi

C++:type_info 区分类型

转载 作者:IT老高 更新时间:2023-10-28 21:57:46 32 4
gpt4 key购买 nike

我知道编译器在实现 std::type_info 函数的行为方面有很大的自由度。

我正在考虑使用它来比较对象类型,所以我想确定:

  1. std::type_info::name 必须为两种不同的类型返回两个不同的字符串。

  2. std::type_info::before 必须说 Type1before Type2 exclusive-or Type2before Type1

    // like this:
    typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )
  3. 同一模板类的两种不同的特化被认为是不同的类型。

  4. 同一类型的两个不同的typedef-initions是同一类型。

最后:

  • 由于 std::type_info 不可复制,我如何将 type_info 存储在某处(例如:在 std::map)? std::type_info 总是分配在某个地方(例如:在堆栈上或在静态/全局变量上)并使用指向它的指针的唯一方法?

  • operator==operator!=before 在大多数常见编译器上的速度有多快?我猜他们应该只比较一个值。 typeid 有多快?

  • 我有一个带有 virtual bool operator==(const A&) const 的类 A。由于 A 有很多子类(其中一些在编译时是未知的),我会以这种方式在任何子类 B 中重载该虚拟运算符:

    virtual bool operator==( const A &other ) const {
    if( typeid(*this) != typeid(other) ) return false;
    // bool B::operator==( const B &other ) const // is defined for any class B
    return operator==( static_cast<B&>( other ) );
    }

    这是实现此类运算符的可接受(和标准)方式吗?

最佳答案

快速浏览文档后,我想说:

  1. std::type_info::name 总是为两种不同的类型返回两个不同的字符串,否则意味着编译器在解析类型时会丢失自己,你不应该再使用它了。

  2. Reference 告诉:“如果类型在排序规则中 rhs 的类型之前,则返回 true。排序规则只是特定实现保持的内部顺序,不一定与继承关系或声明顺序相关。”因此,您可以保证没有任何类型在排序顺序中具有相同的排名。

  3. 模板类的每个实例化都是不同的类型。特化也不异常(exception)。

  4. 我不太明白你的意思。如果您的意思是在两个单独的编译单元中具有 typedef foo bar; 并且该 bar 在两个编译单元中是相同的,那么它就是这样工作的。如果你的意思是 typedef foo bar; typedef int bar;,它不起作用(除非 foo 是 int)。

关于您的其他问题:

  • 您应该存储对 std::type_info 的引用,或者以某种方式包装它。
  • 完全不了解性能,我假设比较运算符具有恒定的时间,尽管类型复杂。 Before 必须具有线性复杂度,具体取决于代码中使用的不同类型的数量。
  • 恕我直言,这真的很奇怪。您应该重载您的 operator== 而不是使其成为虚拟并覆盖它。

关于C++:type_info 区分类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194191/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com