【发布时间】:2014-08-23 04:55:20
【问题描述】:
我有一个问题,我会在发布代码后解释:
template <class T>
std::shared_ptr<T>
getWidget(const std::string& id) {
auto iter = findObject(id);
if (iter != m_widgets.end()) return std::dynamic_pointer_cast<T>(*iter);
return nullptr;
}
const Widget::Ptr
getType(const std::string& id) {
auto iter = findObject(id);
if (iter != m_widgets.end()) {
if ((*iter)->getWidgetType() == "Label")
return std::dynamic_pointer_cast<Label>(*iter);
else if ((*iter)->getWidgetType() == "Editbox")
return std::dynamic_pointer_cast<EditBox>(*iter);
else if ((*iter)->getWidgetType() == "ButtonLabel")
return std::dynamic_pointer_cast<ButtonLabel>(*iter);
else if ((*iter)->getWidgetType() == "Menu")
return std::dynamic_pointer_cast<Menu>(*iter);
}
}
auto type = SceneManager::getCurrentScene().m_gui.getType(widgetId);
SceneManager::getCurrentScene().m_gui.getWidget<decltype(type)>(widgetId)->attachToMenu(getId());
Widget::Ptr 只是一个typedef std::shared_ptr<Widget>。如您所见,m_widgets 是一个包含 Widget 的列表,这些 Widget 是 Label、EditBox、ButtonLabel 和 Menu 的基类。我正在尝试向下转换到这些类,以便我可以获取类型,并使用我的getWidget() 来编辑派生对象。但是我收到了这个错误:
错误:“class std::shared_ptr”没有名为“attachToMenu”的成员|
这显然意味着它没有正确投射并且它正在返回一个小部件。任何帮助都会很棒,谢谢!
【问题讨论】:
-
在
iter == m_widgets.end()的情况下,您有未定义的行为。在这种情况下可能要添加return nullptr。 -
你认为
decltype(type)是什么? -
如果我没看错,
decltype(type)是一个std::shared_ptr<Widget>,所以getWidget返回一个std::shared_ptr<std::shared_ptr<Widget>>,然后调用->attachToMenu(…)是不行的。 -
低调工作正常。
getType的返回类型导致向上转换回Widget::Ptr
标签: c++ templates stl casting smart-pointers