我正在开发自己的 WinAPI 包装库,它负责处理与 GUI 相关的所有内容。我在 Android 平台上看到了一些移植的解决方案(视图、测量/布局/绘制通道、从 XML 中“膨胀”UI)。
现在:我不想重复自己并手动添加静态方法,例如 create 和 inflate 到每个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
现在我必须以某种方式处理歧义 - Button 具有ICreatable ,其中 View 和 Button 都作为 T 传递。我想ICreatable<View>
用ICreatable<Button>
.
- 这在 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)
//...
}
上面的代码是实现我想要的最好的方式(嗯,我认为是最懒惰的方式)。