我想基于typeid访问静态成员函数,而不是单独列出每个成员函数。
这就是我所拥有的,可以正常工作:
if(typeid(*ob) == typeid(Seaweed)) {
Seaweed::getStaticMember();
}
if(typeid(*ob) == typeid(Coral)) {
Coral::getStaticMember()
}
实际上,这是我要去的目的
typeid(*ob)::getStaticMember();
换句话说,我想用下面的1替换上面的4行。我在这里尝试了几种方法,但没有成功。有一种可以产生预期效果的技术吗?
答案 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();