首页 > 解决方案 > 将 typeid 转换为命名空间以进行静态成员访问 (C++)

问题描述

我想访问基于 typeid 的静态成员函数,而不是单独列出每个函数。

这是我所拥有的,它有效:

if(typeid(*ob) == typeid(Seaweed)) {
    Seaweed::getStaticMember();
}
if(typeid(*ob) == typeid(Coral)) {
    Coral::getStaticMember()
}

实际上,这就是我想要的:

typeid(*ob)::getStaticMember();

换句话说,我想用下面的 1 替换上面的 4 行。我在这里尝试了几种方法,但没有成功。有没有产生这种预期效果的技术?

标签: c++

解决方案


使该静态功能成为虚拟功能。由于被调用的函数取决于实例的类型,因此它是实例的属性,而不是类本身。它应该是一个成员函数。

另一种解决方案是将对静态函数的调用包装到虚拟调用中。

struct SeaObject {
    struct static_caller_t {
        virtual void static_call() = 0;
    };

    virtual auto get_static_caller() const -> static_caller_t& = 0;
};

struct Coral : SeaObject {
    struct static_caller_impl : SeaObject::static_caller_t {
        void static_call() override {
            Coral::getStaticMember();
        }
    } static static_caller;

    auto get_static_caller() const override -> static_caller_impl& {
        return static_caller;
    }
};

然后使用静态调用者:

ob->get_static_caller().static_call();

推荐阅读