多态性:通过类文本或对象访问静态成员

Polymorphism: accessing static members via class literal or object

本文关键字:对象 访问 静态成员 文本 多态性      更新时间:2023-10-16

>假设您需要通过类文本或通过该类的继承对象访问结构/类的成员。它可能看起来像这样:

struct Component {
    static const long key = 0;
    virtual long getKey() {return key;};
};
struct FooComponent : Component {
    static const long key = 0x1;
    virtual long getKey() {return key;};
};
struct BarComponent : Component {
    static const long key = 0x2;
    virtual long getKey() {return key;};
};

通过上述方法,可以通过以下方式访问key

long key = FooComponent::key;

FooComponent foo;
long key = foo.getKey();

现在我的问题是:是否有一些更干净、更少冗余的方法来实现上述目标?理想情况下,virtual long getKey() {return key;};只需要指定一次,而不是为每个继承的类指定一次。

编辑:

类层次结构很重要。组件存储在单个容器中,在我的情况下是unordered_map:

std::unordered_map<long, std::unique_ptr<Component>> components;

扩展@iavr对新要求的回答:

struct Component {
  virtual ~Component() {}
  virtual long getKey() { return 0; }
};
template <int Key>
struct KeyedComponent : Component {
  long getKey() { return Key; };
};
struct FooComponent : KeyedComponent<1> { };
struct BarComponent : KeyedComponent<2> { };

测试:

std::vector<std::unique_ptr<Component>> components;
components.emplace_back(new FooComponent());
components.emplace_back(new BarComponent());
for (auto& component : components) {
  std::cout << component->getKey() << std::endl;
}

指纹:

1
2

静态多态性是你的朋友:

template <long K = 0>
struct Component {
    static constexpr long key = K;
    long getKey() {return key;};
};
struct FooComponent : Component <0x1> {};
struct BarComponent : Component <0x2> {};