c – 如何避免使用更好的抽象类型?

我在我的代码中使用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()问题:前者变为==,后者变为%.

点赞