gpt4 book ai didi

c++ - 我的 GUI 模板化小部件系统出现问题

转载 作者:行者123 更新时间:2023-11-28 06:43:36 25 4
gpt4 key购买 nike

我要先贴出我的代码,然后再解释我的问题:

    std::list<Widget::Ptr> m_widgets;

std::list<Widget::Ptr>::iterator findObject(const std::string& id)
{
for (auto iter = m_widgets.begin(); iter != m_widgets.end(); ++iter)
{
if ((*iter)->getId() == id)
return iter;
}

return m_widgets.end();
}

template <class T> void pushWidget(std::shared_ptr<T> widget)
{
auto iter = findObject(widget->getId());

if (iter != m_widgets.end())
return;

m_widgets.push_back(std::dynamic_pointer_cast<Widget>(widget));
}

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 std::type_index& getType(const std::string& id)
{
auto iter = findObject(id);

if (iter != m_widgets.end())
return typeid(*iter);
}

Widget::Ptr 是 std::shared_ptr 的类型定义。无论如何,我遇到的问题是如何告诉 getWidget() 小部件是什么类型的小部件。 Widget 是其他小部件继承的基类,例如 Label、Editbox 等。对于我的主要 GUI 管理器,我正在尝试尽可能地缩短我的代码以使更新/绘制尽可能干净。现在,Menu 是我在这种情况下尝试使用的一种小部件:

auto type = SceneManager::getCurrentScene().m_gui.getType(widgetId);

SceneManager::getCurrentScene().m_gui.getWidget<typeid(type)>(widgetId)->attachToMenu(getId());

但是,这不起作用,我从我的编译器中得到这些错误:

error: no matching function for call to 'SE::GUI::getWidget(const string&)'|
note: candidate is:|
note: template<class T> std::shared_ptr<_Tp> SE::GUI::getWidget(const string&)|
note: template argument deduction/substitution failed:|

如果需要,我可以提供更多详细信息,感谢您提供的所有帮助!

最佳答案

typeid(type) 不返回表达式 type 的类型,而是返回有关类型 (RTTI) 的运行时信息。你想要的是 decltype(),它返回一个表达式的类型:

SceneManager::getCurrentScene().m_gui.getWidget<decltype(type)>(widgetId)->attachToMenu(getId());

关于c++ - 我的 GUI 模板化小部件系统出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25453234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com