我在我的代码中使用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 = 2; B :: my_type = 3)
>然后为每个类额外分配其类型和基类值的乘积(例如,A :: can_cast = A :: my_type; B :: can_cast = B :: my_type * A :: can_cast;)
这优雅地解决了is_same_dynamic(),is_base_dynamic()问题:前者变为==,后者变为%.