将typeID转换为静态成员访问(C )的命名空间
Converting typeid to namespace for static member access (C++)
我想基于typeID访问静态成员函数,而不是单独列出。
这是我拥有的,它有效:
if(typeid(*ob) == typeid(Seaweed)) {
Seaweed::getStaticMember();
}
if(typeid(*ob) == typeid(Coral)) {
Coral::getStaticMember()
}
这实际上是我要做的:
typeid(*ob)::getStaticMember();
换句话说,我想将上面的4行替换为下面的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();
您应该拥有的是
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();
相关文章:
- VS2017 是否更改了 C++ 中访问 C# 命名空间的方式?
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- C++使用其他命名空间中的符号,而不使它们可从外部访问
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 将typeID转换为静态成员访问(C )的命名空间
- 如何使客户端无法访问命名空间的函数
- 从另一个命名空间访问标准命名空间数据成员
- 如何访问其他 .cc 文件中命名空间中定义的函数
- 使用命名空间和模板类访问变量
- 从另一个命名空间中C++全局命名空间访问
- 限制字段突变/对命名空间的访问
- 为什么std::generate在没有命名空间限定符的情况下是可访问的
- 为什么我的类友元函数无法访问具有命名空间的受保护成员?
- C++ 中的匿名命名空间无法访问标头
- C++访问具有相同名称的变量/对象的命名空间中的全局变量/对象
- 为什么命名空间中的某些函数可以在没有命名空间范围前缀的情况下访问
- 嵌套命名空间:从内部命名空间访问值
- 从命名空间访问映射
- 在c++中从父命名空间访问隐藏操作符
- 如何在节俭中跨命名空间访问变量