我正在设计一个 GUI,但我遇到了问题,因为我无法避免 dynamic_casting。
我的课程:
class Widget; //base class for all widgets
class Container //contains widgets
{
std::map<std::string, Widget*> m_widgets;
public:
template <class T> T* get(const std::string &name)
{
return dynamic_cast<T*>(m_widgets.at(name)); //I need casting here
}
}
如何避免动态投射?我不能为每种小部件类型都拥有容器,因为我的 GUI 必须与用户定义的小部件一起使用。此外,我必须为每个小部件都有一个容器,这样用户就不必自己存储小部件。
为什么我需要铸造?
class TextBox : public Widget
{
public:
std::string getText(); //I can't have it in Widget class, because it's object-specific
//also, my gui must work with user-defined widgets so I can't provide
//empty virtual functions for everything in Widget
}