我最近在网上看到这个例子:
typedef std::tuple<
CInput,
CAnimation,
CTransform
> ComponentTuple;
class Entity
{
...
ComponentTuple m_components;
public:
...
// component management
template <typename T> bool has_component() const { return get_component<T>().has; }
template <typename T, typename... TArgs> T& add_component(TArgs&&... mArgs)
{
auto& component = get_component<T>();
component = T(std::forward<TArgs>(mArgs)...);
component.has = true;
return component;
}
template <typename T> T& get_component() { return std::get<T>(m_components); }
template <typename T> const T& get_component() const { return std::get<T>(m_components); }
template <typename T> void remove_component() { get_component<T>() = T(); }
};
字符串
我已经研究了几个小时的代码,我不能弄清楚模板成员has_component和add_component
是如何工作的-特别是has
成员。这是从哪里来的?它没有在标准中记录,我可以看到的任何地方。然而,不知何故,has
成员在add_component
中被设置为true,并且可以在has_component
中检查。
显然,这里的目标是使用has来确定元组条目是否是默认构造的。
1条答案
按热度按时间vhmi4jdf1#
在这里提供一些结束。User@user17732522提供了我需要的线索来弄清楚发生了什么,以及使用
std::optional
的更好实现的建议:字符串
在这个实现中,元组可以管理的类型绝对没有任何限制,除了每个类型必须是唯一的,这样成员就可以通过类型而不是索引找到元素。
代码可以这样写:
型
非常感谢那些回答的人。