【问题标题】:What is `type_info::before` useful for?`type_info::before` 有什么用?
【发布时间】:2012-01-30 17:46:16
【问题描述】:

根据cplusplus.com,std::type_info::before()函数...

如果该类型在排序规则中位于 rhs 的类型之前,则返回 true。
排序顺序只是特定实现保持的内部顺序,不一定与继承关系或声明顺序有关。

那么它有什么用呢?

【问题讨论】:

    标签: c++ rtti typeinfo


    【解决方案1】:

    假设您想将 type_info 对象作为键放入 map<type_info*, value>type_info 没有定义 operator <,因此您必须提供自己的比较器。唯一能保证在type_info 接口上工作的是before() 函数,因为type_infoname() 的地址都不能是唯一的:

    struct compare {
        bool operator ()(const type_info* a, const type_info* b) const {
            return a->before(*b);
        }
    };
    
    std::map<const type_info*, std::string, compare> m;
    
    void f() {
        m[&typeid(int)] = "Hello world";
    }
    

    【讨论】:

    • "type_info 没有定义operator &lt;,因此您必须提供自己的比较器。" std::less&lt;&gt;std::map&lt;&gt; 的默认比较器) ) 适用于 all 指针,您只需获得地址排序而不是排序规则。
    • @ildjarn:你误解了这个问题。该标准不保证每种类型最多存在一个type_info。事实上,经常会遇到为同一类型创建多个typeinfo。最简单的情况是动态链接库的上下文,就像 Dietmar 所说的那样。
    • @ildjarn 重新阅读您的报价单。它讨论了type_infooperator &lt;,但您争论比较指向type_info 的指针的有效性,暗示引用的句子在某种程度上是错误的。但事实并非如此,因为我没有说任何关于比较指针的事情。那你们为什么要写无关紧要的cmets?
    • 我不明白&amp;typeid(type) 做了什么。在这个例子中它获取对象typeid(int) 的地址?但是什么是typeid(int) - 我认为这将返回一个整数,如sizeof,但是当获取该对象的地址时这似乎没有意义......你能否添加一些解释这个示例中的那行代码呢?
    • @user3728501:它返回一个静态分配的type_info类型的对象。
    【解决方案2】:

    这对于定义 typeinfo 对象的顺序很有用,例如将它们放入 std::map 中。显而易见的后续问题是:为什么不拼写为 operator

    【讨论】:

    • "显而易见的后续问题是:为什么不拼写为 operator" 如何为指针类型定义 operator &lt;
    • type_info 没有复制构造函数或复制赋值运算符,因此不能直接存储到容器中。当然,关联容器的键类型不能是引用,所以唯一剩下的选择是存储一个type_info*,不能为其提供operator&lt;。可能明智的做法是专攻std::less&lt;type_info*&gt;
    • @ildjarn:Dietmar 的问题是“为什么 type_infobefore() 而不是 operator&lt;”。虽然你说的是对的,但并没有回答他的问题。例如。为什么我不能写typeid(int) &lt; typeid(long),而我必须使用typeid(int).before(typeid(long))
    • @DietmarKühl:请注意,C++11 定义了 type_index,它只是 const type_info* 的包装,并定义了所有比较运算符。
    • @YakovGalka 我查看了 type_index 的 llvm 实现。构造函数引用 type_info 但“持有”它的内部私有字段是指向 type_info 对象的指针。为什么他们在内部使用指针而不是引用? github.com/llvm/llvm-project/blob/main/libcxx/include/…
    【解决方案3】:

    它给出了一个命令。

    如果您想将值存储在某些容器中,例如 std::map,这是必需的。

    【讨论】:

      【解决方案4】:

      将其视为type_info 对象的小于 (&lt;) 运算符。如果您想存储在有序集合中 - 这样的一组地图 - 您可以使用它来制作适当的比较器。这是一种可靠且首选的方式,而不是使用可能不唯一的类型名称。

      【讨论】:

        猜你喜欢
        • 2018-08-28
        • 2011-11-11
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多