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

C++ 将typeid转换为静态成员访问的命名空间(C+;+;),c++,C++,我希望基于typeid访问静态成员函数,而不是单独列出每个函数 以下是我所拥有的,有效的: if(typeid(*ob) == typeid(Seaweed)) { Seaweed::getStaticMember(); } if(typeid(*ob) == typeid(Coral)) { Coral::getStaticMember() } 实际上,我的目标是: typeid(*ob)::getStaticMember(); 换句话说,我想用下面的1替换上面的4行。我在

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

以下是我所拥有的,有效的:

if(typeid(*ob) == typeid(Seaweed)) {
    Seaweed::getStaticMember();
}
if(typeid(*ob) == typeid(Coral)) {
    Coral::getStaticMember()
}
实际上,我的目标是:

typeid(*ob)::getStaticMember();

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

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

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

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

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

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

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();
类IStaticMemberExposable
{
公众:
虚拟向量getStaticMember()=0;
};
类别海藻:公共IStaticMemberExposable
{
虚拟向量getStaticMember()重写
{
//您在这里的实现
}
};
类别:公共IStaticMemberExposable
{
虚拟向量getStaticMember()重写
{
//您在这里的实现
}
};
//叫它。。。
ob->getStaticMember();

你应该拥有的是

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();
类IStaticMemberExposable
{
公众:
虚拟向量getStaticMember()=0;
};
类别海藻:公共IStaticMemberExposable
{
虚拟向量getStaticMember()重写
{
//您在这里的实现
}
};
类别:公共IStaticMemberExposable
{
虚拟向量getStaticMember()重写
{
//您在这里的实现
}
};
//叫它。。。
ob->getStaticMember();

Seaweed和
Coral
是否有一个公共基类?这看起来确实像是虚拟函数的作业……实际上typeid()不返回实际类型,所以不能执行声明之类的操作。它只返回类型id(函数名,哈哈),你可以将它与另一个类型id进行比较。即使不诚实,这看起来也像是一个虚拟函数的作业。是的,好吧,既然大家都提到了它,这看起来很明显。只需通过虚拟函数返回静态成员。收到。谢谢
Seaweed
Coral
是否有一个公共基类?这看起来确实像是一个虚拟函数的作业……实际上typeid()不返回实际类型,所以不能执行类似于声明的操作。它只返回类型id(函数名,哈哈),你可以将它与另一个类型id进行比较。即使不诚实,这看起来也像是一个虚拟函数的作业。是的,好吧,既然大家都提到了它,这看起来很明显。只需通过虚拟函数返回静态成员。收到。谢谢别忘了
override
关键字。override不是强制性的,但我必须承认,拥有它是件好事。谢谢提醒。在派生类中添加。
virtual
是可选的。不要忘记
override
关键字。override不是强制性的,但我必须承认它是一件很好的事情。谢谢提醒。在派生类中添加。
virtual
是可选的。