C++ 将typeid转换为静态成员访问的命名空间(C+;+;)
我希望基于typeid访问静态成员函数,而不是单独列出每个函数 以下是我所拥有的,有效的: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行。我在
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
是可选的。