假设您需要通过类文字或该类的继承对象访问结构/类的成员。它可能看起来像这样:
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;
答案 0 :(得分:2)
静态多态性是你的朋友:
template <long K = 0>
struct Component {
static constexpr long key = K;
long getKey() {return key;};
};
struct FooComponent : Component <0x1> {};
struct BarComponent : Component <0x2> {};
答案 1 :(得分:2)
扩展@ 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