将typeID转换为静态成员访问(C )的命名空间

Converting typeid to namespace for static member access (C++)

本文关键字:命名空间 访问 typeID 转换 静态成员      更新时间:2023-10-16

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

这是我拥有的,它有效:

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

这实际上是我要做的:

typeid(*ob)::getStaticMember();

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

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

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

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();

您应该拥有的是

class IStaticMemberExposable
{
public:
    virtual vector<string> getStaticMember() = 0;
};
class Seaweed : public IStaticMemberExposable
{
    virtual vector<string> getStaticMember() override
    {
        //your implementation here
    }
};
class Coral : public IStaticMemberExposable
{
    virtual vector<string> getStaticMember() override
    {
        //your implementation here
    }
};
//To call it...
ob->getStaticMember();