c++ - 将 typeid 转换为命名空间以进行静态成员访问 (C++)
问题描述
我想访问基于 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();
推荐阅读
- javascript - 如何在不增加尺寸的情况下放大图像?
- sql - 使用 SQL Server 中的系统表查找表中特定日期的所有记录
- php - 获取未定义的变量:实时网站上的 postType 但不是测试网站
- r - 我需要帮助理解 grep 函数中的模式代码
- python - Sympy多项式求解器可以根据多项式的多重性列出多项式的零点吗?
- microsoft-graph-api - 驱动器或文件夹层次结构中的 Microsoft 图形搜索不返回任何内容
- python-3.6 - ImportError:无法找到导入模块中定义的类
- mit-scratch - Set X() 和 Set Y() 块在 Scratch 中不起作用
- angularjs - NgMask 强制自定义模式
- java - 如何在地址为 46.XXX.XX.XX:8008/ 的页面中下载 java 小程序类文件