(这个问题与反射有关,但实际上与反射无关)
我有这个类的层次结构(比如class A
和class B : public A
),除了特定于实例的数据之外,我还希望所有实例共享特定于类的数据。例如,假设我想为FunnyClassName
我的每个类创建一个字符串。
我希望能够为我的每类数据使用非虚拟吸气剂,例如:
/*can it be static? */ const std::string& A::GetFunnyName();
最重要的是,我希望在继承类中没有或尽可能少的样板代码。class A
getter 将在(类层次结构的根)中实现一次;B 类应该以其他方式指定它的 FunnyClassName。
有人建议(例如,间接地在 SO 上的问题中)使用类的类型哈希作为键的 Multiton 对象可能是合理解决方案的基础。是这样吗?是否有执行此操作的“标准”代码(例如在 STL 或 Boost 中)?还有另一种相关的方法吗?
备注:
- 认为这是不可能的吗?请参阅这个问题和这个(简洁的)答案。但正如一些评论者和响应者所建议的那样,可能有必要使用非静态 getter,并进行更弱的约束,即不必为每个类重写 getter(即使用 RTTI)。
- 如果 C++ 有静态虚拟数据成员,这将是微不足道的 -
virtual static const std::string FunnyName
。使用静态虚拟方法也是可能的,但前提是我们放弃对仅在基类中实现的 getter 的要求。我们会有类似/* static??*/ static const std::string& A::GetFunnyName() { return "Aye"; }
and的东西/* static??*/ const std::string& B::GetFunnyName() { return "Bee"; }
。 - 我对模板类的情况并不特别感兴趣,但如果你也想解决这个问题,那很好。
- FunnyName() 只是一个例子。可能是
const Thing& GetFunnyThing()
。我不想要 typeid.name() 中的类名称,或者它的去修饰,等等。 - C++11 没问题,但 C++03 中的解决方案会更好。请不要 C++14。