【发布时间】:2012-01-30 17:46:16
【问题描述】:
根据cplusplus.com,std::type_info::before()函数...
如果该类型在排序规则中位于 rhs 的类型之前,则返回 true。
排序顺序只是特定实现保持的内部顺序,不一定与继承关系或声明顺序有关。
那么它有什么用呢?
【问题讨论】:
根据cplusplus.com,std::type_info::before()函数...
如果该类型在排序规则中位于 rhs 的类型之前,则返回 true。
排序顺序只是特定实现保持的内部顺序,不一定与继承关系或声明顺序有关。
那么它有什么用呢?
【问题讨论】:
假设您想将 type_info 对象作为键放入 map<type_info*, value>。 type_info 没有定义 operator <,因此您必须提供自己的比较器。唯一能保证在type_info 接口上工作的是before() 函数,因为type_info 和name() 的地址都不能是唯一的:
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 <,因此您必须提供自己的比较器。" std::less<>(std::map<> 的默认比较器) ) 适用于 all 指针,您只需获得地址排序而不是排序规则。
type_info。事实上,经常会遇到为同一类型创建多个typeinfo。最简单的情况是动态链接库的上下文,就像 Dietmar 所说的那样。
type_info 的operator <,但您争论比较指向type_info 的指针的有效性,暗示引用的句子在某种程度上是错误的。但事实并非如此,因为我没有说任何关于比较指针的事情。那你们为什么要写无关紧要的cmets?
&typeid(type) 做了什么。在这个例子中它获取对象typeid(int) 的地址?但是什么是typeid(int) - 我认为这将返回一个整数,如sizeof,但是当获取该对象的地址时这似乎没有意义......你能否添加一些解释这个示例中的那行代码呢?
type_info类型的对象。
这对于定义 typeinfo 对象的顺序很有用,例如将它们放入 std::map 中。显而易见的后续问题是:为什么不拼写为 operator
【讨论】:
operator <?
type_info 没有复制构造函数或复制赋值运算符,因此不能直接存储到容器中。当然,关联容器的键类型不能是引用,所以唯一剩下的选择是存储一个type_info*,不能为其提供operator<。可能明智的做法是专攻std::less<type_info*>。
type_info 有 before() 而不是 operator<”。虽然你说的是对的,但并没有回答他的问题。例如。为什么我不能写typeid(int) < typeid(long),而我必须使用typeid(int).before(typeid(long))。
type_index,它只是 const type_info* 的包装,并定义了所有比较运算符。
type_index 的 llvm 实现。构造函数引用 type_info 但“持有”它的内部私有字段是指向 type_info 对象的指针。为什么他们在内部使用指针而不是引用? github.com/llvm/llvm-project/blob/main/libcxx/include/…
它给出了一个命令。
如果您想将值存储在某些容器中,例如 std::map,这是必需的。
【讨论】:
将其视为type_info 对象的小于 (<) 运算符。如果您想存储在有序集合中 - 这样的一组地图 - 您可以使用它来制作适当的比较器。这是一种可靠且首选的方式,而不是使用可能不唯一的类型名称。
【讨论】: