C++ C++;如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中 意图和背景

C++ C++;如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中 意图和背景,c++,components,C++,Components,我有一个名为Component的类。 它看起来有点像这样(伪代码): 如果这是不可能的,请帮助我找到实现这一点的方法,同时避免我列出的负面观点 提前谢谢 我希望此格式副本更好。您似乎想要: class Blueprint { private: std::vector<std::function<void(Entity &)>> functions; public: template<typename T, typename... Args&g

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

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

提前谢谢

我希望此格式副本更好。

您似乎想要:

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);
        }
    }
};
类蓝图
{
私人:
向量函数;
公众:
模板
void addTo(组件和组件,参数…参数)
{
函数。向后放置([=,&组件](实体和ent)
{
组件。添加到(ent、args…);
});
}
无效应用程序(实体和en)
{
用于(常量自动和f:功能){
f(en);
}
}
};

什么是“附加信息”?你为什么不把你的问题变成一个整体,而不是把不同的编辑粘贴在一起?也就是说,你能把你的问题简化成两个函数吗?或者说,这是可行的吗?顺便说一句:每个调用的参数都可以存储在一个元组中,一个可以保存多个类型的值的类型被称为变量。这确实是一个XY问题。编译器已经在其函数重载机制中提供了此功能。不要重新发明轮子。你知道如何创建lambda函数并将其存储在
std::function
中吗?如果这不起作用,为什么不呢?为什么不创建一个包含所有addTo重载的包装器类,让编译器确定要调用哪个重载?好吧,我将花一点时间回答所有这些注释,然后尝试使用伪代码编写一个示例@因为传递的类型是由一个模板参数定义的,该模板参数被赋予被“添加到”的组件类。给函数本身一个这样的参数可以解决这个问题,但是这会造成潜在的类型不匹配,我不想让一些模糊的错误代码像那样四处游荡(类型不匹配没有匹配的函数调用那么明显)。我可能全是废话,虽然这只是我的猜测,但我在尝试使用你的类时出错了。blueprint.h | 14 |错误:在“=”标记|之前应该有标识符(参考“functions.emplace|u back”这一行,这可能是后续错误。| 16 |错误:“args”未被捕获|(参考“component.AddTo(ent,args…)”这一行在捕获中纠正了打字错误:
[=,&component]
。谢谢:)我自己临时修复了它,用args替换了=,但是这个silution看起来好多了;)很有魅力。由于某种原因,删除操作现在被窃听了,但这就是我没有进行单元测试的原因。我来修。谢谢你的帮助:哦
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);
        }
    }
};