gpt4 book ai didi

C++如何将参数绑定(bind)到具有相同返回类型的函数并将它们全部存储在一个容器中

转载 作者:行者123 更新时间:2023-11-30 05:01:04 30 4
gpt4 key购买 nike

意图和背景

我有一个名为 Component 的类。它看起来有点像这样(伪代码):

template <class t>
class Component{
private:
map<Entity, List<t>> attachedEntities;
public:
//Some other stuff like constructors, setters and getters etc.
template<typename... Args>
void addTo(const Entity &en, Args...args)
{
this->addTo(en,std::make_shared<t>(std::forward<Args>(args)...));
}

template < typename U, typename std::enable_if< std::is_base_of<t, U>::value, U>::type* = nullptr >
void addTo( const Entity &en,U* ptr)
{
this->addTo(en,shared_ptr<t>(ptr));
}
void addTo(const Entity &en,const std::shared_ptr<t> ptr)
{
/*
Does the actual adding to the map
*/
}
}

(对于想知道 Entity 与此问题的前一版本中的 Target 相同的任何人。再三考虑,Entity 更有意义)

出于教育目的,我不愿意为传递的变量编写包装器。

如您所见,Component 类有 3 个 addTo 函数。现在我的系统是一个简单的组件实体系统,其中实体代表一个 UUID,它在 map 中用作键。这些映射在使用单个 UUID 进入上下文时可以“形成”一个完整的实体。

例如,一个实体可能在

中有一个条目
  • 字符串组件
  • 纹理组件
  • 模型组件

当一个函数遍历所有模型并寻找合适的字符串和纹理时,它将呈现我们想要的。例如,与 ModelComponent 中的实体关联的模型可以是箱子的模型,纹理是箱子模型的漫反射纹理,字符串可以简单地说明玩家在与其交互之前应该看到什么。

这在我的程序中已经很好用了!然而,我正在努力的是为一个对象制作某种模板,然后它会被一遍又一遍地实例化。对于这个例子,假设我想创建一个代表 Bullet

的实体

子弹可能有:

  • 代表其外观的模型
  • 一个 CollissionBox,用于检测物体何时与其发生碰撞
  • 撞击时播放的声音
  • 某种标签 (StringComponent) 以确保更新函数正确更新它(因此它可能会有标签“Bullet_big”)

这再次起作用,但是现在只能通过使实体免受删除并让其他项目符号成为该实体的拷贝来实现。这很糟糕,原因如下:

  • 它为游戏添加了一些可以交互但不能删除的东西。如果我这样做了,那么除了删除之外,所有东西都无法访问,这仍然会增加开销,因为在调用 get 或 set 时必须给出某种排序替换
  • 它在它拥有的每张 map 中都是一个不可用的项目。对于较大的程序来说,这可能会成为一个问题,其中可能有数百个这样的"template"在周围 float
  • 如果模板被删除,无论是由于开发人员的疏忽还是由于错误,拷贝很可能会导致崩溃或开始表现异常。

我实际上在挣扎什么

我现在要做的是编写一个Blueprint

这个类应该是:

  • 可用于创建具有相同组件的新实体的容器。
  • 没有实际征募任何 map 。
  • Aaaand 无需手动对每个组件名称进行大小写检查以确定要添加的组件(那将是愚蠢的)。

这是我的想法:

class Blueprint{
private:
vector<function<???>> frozenAddFunctions; //Some way of storing all the functions with the init paramters but WITHOUT the entity specified;
public:
template<t,typename... Args>
void addTo(Component<t>, Args...args){
//Somehow binding the approperate addTo overload to the arguments
}
void applyOnto(Entity &en){
for(function f:this->frozenAddFunctions){
f(en); //somehow invoke the addTo functions onto the Entity.
}
}

如果这是不可能的,请帮助我找到实现这一目标的方法,同时避免我列出的负面因素。

提前致谢。

我希望这个演绎更好。

最佳答案

看来你想要:

class Blueprint
{
private:
std::vector<std::function<void(Entity &)>> functions;
public:
template<typename T, typename... Args>
void addTo(Component<T>& component, Args...args)
{
functions.emplace_back([=, &component](Entity& ent)
{
component.AddTo(ent, args...);
});
}

void applyOnto(Entity &en)
{
for(const auto& f : functions){
f(en);
}
}
};

关于C++如何将参数绑定(bind)到具有相同返回类型的函数并将它们全部存储在一个容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50448767/

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