gpt4 book ai didi

c++ - 如何通过更好的抽象来避免 typeid?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:14 26 4
gpt4 key购买 nike

我在我的代码中使用了 typeid,但在我看来,如果我避免使用 typeid,代码会更清晰。

如果我们要存储类的类型,为什么我们首先要选择面向对象的语言呢?

但我一遍又一遍地看到这种模式,我不知道如何避免它。

所以我在想是否可以通过更好的抽象将这段代码写得更干净?

代码如下:

class A {
public:
string type;
};

template <typename T>
class B : public A {
public:
B() {
type = typeid(T).name();
}
};

class Registry {
private:
std::vector<A *> list;
public:
void append(A * a) {
int found = 0;
for (A * el : list) {
if (a->type == el->type) {
found = 1;
break;
}
}
if (!found)
list.push_back(a);
}

int size() {
return list.size();
}
};

int main(int argc, char **argv) {

Registry reg;

A * b_int1 = new B<int>();
A * b_int2 = new B<int>();
A * b_float = new B<float>();

reg.append(b_int1);
reg.append(b_int2);
reg.append(b_float);

cout << reg.size() << endl;

return 0;
}

输出为2.(这是预期的结果)

基本上我们不想在列表中存储两个相同类型的对象。

最佳答案

如果您不想要访问者,但想要快速 RTTI,我建议您查看这篇论文:http://www.stroustrup.com/fast_dynamic_casting.pdf

思路是:

  • 每个类都为其自己的类型分配了一个不同的质数(例如,A::my_type = 2B::my_type = 3)
  • 然后为每个类额外分配其类型和基类值(如果有的话)的乘积(例如,A::can_cast = A::my_type; B::can_cast = B: :my_type * A::can_cast; )

这优雅地解决了is_same_dynamic()is_base_dynamic()问题:前者变为==,后者变为%.

关于c++ - 如何通过更好的抽象来避免 typeid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38125178/

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