将typeid转换为名称空间以进行静态成员访问(C ++)

时间:2019-05-13 22:32:54

标签: c++

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

这就是我所拥有的,可以正常工作:

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

实际上,这是我要去的目的

typeid(*ob)::getStaticMember();

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

你应该拥有的是

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