如何处理同一模板多重继承中的歧义
How to deal with ambiguities in same template multiple inheritance?
我正在开发自己的WinAPI包装器库,它负责处理与GUI相关的一切。我在Android平台上看到了一些移植的解决方案(视图、测量/布局/绘制过程、从XML"膨胀"UI)。
现在:我不想重复我自己,也不想手动添加静态方法,如创建和膨胀到每个View
(Button
、GridView
、TextView
等)。
基本View
类派生自(将View作为T传递):
template<class T>
class ICreatable : std::enable_shared_from_this<T> {
public:
static std::shared_ptr<T> create() {
return std::shared_ptr<T>(new T()); //assume that T has such constructor
}
static std::shared_ptr<T> inflate(AttributeSet* attrs) {
return std::shared_ptr<T>(new T(attrs)); //assume that T has such constructor
}
std::shared_ptr<T> ptr() {
return enable_shared_from_this::shared_from_this();
}
};
子类派生自View和ICreatable:
class Button : public View, public ICreatable<Button> {
//...
}
现在我必须以某种方式处理模糊性——Button具有ICreatable,View和Button都作为T传递。我希望Button
用ICreatable<Button>
覆盖ICreatable<View>
。
- 这在C++中可能吗
- 如果没有,还有其他方法吗实现这种"自动静态方法添加">
- 我应该吗回到我的第一个(糟糕的)想法,手动添加静态create()和inflate()方法添加到每个视图
编辑:经过一番讨论,我提出了一种#define
方法,将这些方法缩短为一行:
#define InsertCreatableMethods(T)
static std::shared_ptr<T> create() {
return std::shared_ptr<T>(new T());
}
static std::shared_ptr<T> inflate(AttributeSet* attrs) {
return std::shared_ptr<T>(new T(attrs));
}
//...
class Button : public View {
//...
public:
InsertCreatableMethods(Button)
//...
}
上面的代码是实现我想要的最好的方式(我认为这是最懒惰的方式)。
如果按如下方式编写IView
:
template <class T>
class View : public ICreatable<T>
您可以将按钮写为:
template <class T>
class Button : public View<T>
而且不需要双重继承。如果你有另一个
class RadioButton : public Button<RadioButton>
一般来说,拥有一个深度继承树不是一个好的设计。中间叶应该是抽象的。Button
没有具体意义。只有RadioButton
可以。更好的设计应该是:
template <class T>
class IView : public ICreatable<T>
class View : public IView<View>
template <class T>
class IButton : public IView<T>
class Button : public IButton<Button>
这样就没有双重继承,每个类都有一个简单的继承树。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 引用如何解决多重继承中的歧义
- 如何处理同一模板多重继承中的歧义
- 消除多重继承中类成员的歧义
- 与 [] 运算符和多重继承的歧义
- 关于多重继承和歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 多重虚拟继承歧义
- c++多重继承有歧义
- 多重继承歧义基类