gpt4 book ai didi

c++ - 为每个类获取 int Id,使用类名及其对象调用

转载 作者:行者123 更新时间:2023-11-28 05:39:15 25 4
gpt4 key购买 nike

我有很多类,B1 B2 ... 派生自同一个名为 A 的类。

我想创建一个函数

getId<B1>() , getId<B2>() , ...

为每个类返回唯一的 int 并且结果与

一致
get_id(new B1()) ,  get_id(new B2())    .... 

换句话说,

getId<Bi>() == get_id(new Bi())  .... for every i   (1)
getId<Bi>() != getId<Bj>() .... when i!=j (2)

B1 B2只是一个符号,它们是现实生活中没有整数的较长名称。

如何实现这两个功能?

要求:
1.我不必编辑所有的Bi.h(B1 B2 ...类),因为它们很多。
2. 不允许为每个类手动分配整数,因为这很繁琐。
3. typeid 或 dynamic_cast 不能使用,因为它很慢(我试过了。)
4.模板就可以了
5. 非确定性是可以的
6.(奖励)如果生成的整数是低值的(例如 B1=1,B2=2 ...),那就太好了。

结果(整数)将用于哈希函数。

我已经搜索过,但没有找到同时满足 (1) 和 (2) 的解决方案。
例如,Efficient way to generate id unique to class?帮助不够。

最佳答案

我的回答不是花哨的模板,因为我认为你链接的另一个线程中已经提供了它,说它不够好。但我确实有办法解决你的困境,即使我会改变一些要求。

您有一个基类和许多虚拟子类。我会假设 virtual int get_id() const=0;是有可能的,因为它已经是一个虚拟基地。这是大多数人会立即做的事情,但您是在现有的大型系统上对其进行改造,并且无法手动分配所有这些 ID。

这太乏味了,要是我们有一台电脑就好了……等等。

您可以通过在标题中搜索诸如 grep ": public class A"之类的内容来获取所有类名,或者如果它们过于分散且编写不一致而无法从标题中轻松获取它们,那么只需将 get_id 设为纯,并且grep 编译器错误消息以获取所有这些类名。将输出转储到文件中。现在,编写一个快速而肮脏的 python 脚本来读取输出中的每一行,然后编写

print "int {}::get_id() const {{ return {}; }}".format(classname, linenumber)

我省略了使用 re 提取类名的细节,因为您可以在 grep 或脚本中执行此操作,或者编写一个简短的 C++ 帮助程序。重点是,您可以将其输出到一个新的 cpp 文件,并且(使用正确的包含),您现在已经自动为每个类分配了 id。

它不会将 id 分配给新类,但至少从现在开始不会太乏味,尤其是如果您保持 get_id 是纯的。

关于c++ - 为每个类获取 int Id,使用类名及其对象调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535809/

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