首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::bind作为std::bind的参数

std::bind作为std::bind的参数
EN

Stack Overflow用户
提问于 2017-02-08 05:25:03
回答 1查看 498关注 0票数 0

我有以下代码:

代码语言:javascript
复制
static std::vector<std::multimap<float, std::function<void(void)> > > LoadedDelegates;

std::function<void(FVector2D, std::function<void(ASwatterFly*)>)> ShooterFunc = [this](FVector2D Input, std::function<void(ASwatterFly*)> InputFly)
{
    this->RemainingFlies.Add(this->MakeShooterFly(Input, InputFly));
};

LoadedDelegates.push_back(std::multimap<float, std::function<void(void)> >
{
    {
        3.f,
        std::bind(ShooterFunc, FVector2D(1.f, 0.f), std::bind(&ASwatterLevelBase::ShootAndScootMisdirection, this, std::placeholders::_1, FVector2D(0.f, 0.f), 8))
    }
});

我在另一个bind中有一个bind,用于从std::function<void(ASwatterFly*)> >转换为std::function<void(void)> >。这段代码不能编译。但是,如果我将绑定移动到一个变量中,并像这样传递它:

代码语言:javascript
复制
static std::vector<std::multimap<float, std::function<void(void)> > > LoadedDelegates;

std::function<void(FVector2D, std::function<void(ASwatterFly*)>)> ShooterFunc = [this](FVector2D Input, std::function<void(ASwatterFly*)> InputFly)
{
    this->RemainingFlies.Add(this->MakeShooterFly(Input, InputFly));
};

std::function<void(ASwatterFly*)> TestFunc = std::bind(&ASwatterLevelBase::ShootAndScootMisdirection, this, std::placeholders::_1, FVector2D(0.f, 0.f), 8);

LoadedDelegates.push_back(std::multimap<float, std::function<void(void)> >
{
    {
        3.f,
        std::bind(ShooterFunc, FVector2D(1.f, 0.f), TestFunc)
    }
});

它起作用了。为什么我必须将第二个绑定作为变量传入,在这种情况下,它才能被编译?

EN

回答 1

Stack Overflow用户

发布于 2017-02-08 11:44:23

因此,正如我在其中一个问题的评论中提到的,this question的答案是为什么会发生这种情况的原因。我想要做的是能够在绑定中添加绑定参数,而不必每次都创建新的变量。通过这样做,我想出了一个合适的解决方案:

代码语言:javascript
复制
static std::vector<std::multimap<float, std::function<void(void)> > > LoadedDelegates;

std::function<void(FVector2D, std::function<void(ASwatterFly*)>)> ShooterFunc = [this](FVector2D Input, std::function<void(ASwatterFly*)> InputFly)
{
    this->RemainingFlies.Add(this->MakeShooterFly(Input, InputFly));
};

std::function<void(ASwatterFly*)> DummyFunc;

LoadedDelegates.push_back(std::multimap<float, std::function<void(void)> >
{
    {
        3.f,
        std::bind(ShooterFunc, FVector2D(1.f, 0.f), DummyFunc = std::bind(&ASwatterLevelBase::ShootAndScootMisdirection, this, std::placeholders::_1, FVector2D(0.f, 0.f), 8))
    },
    {
        6.f,
        std::bind(ShooterFunc, FVector2D(-0.2f, 1.f), DummyFunc = std::bind(&ASwatterLevelBase::LaserShooter, this, std::placeholders::_1, this->GetVecFromScreenPercentage(0.15f, 0.9f), 1, 0.f, 0.f, 3.f, 260.f, 0.f, FLinearColor(15.f, 3.f, 3.f)))
    },
    //etc.
});

因此,我可以只使用DummyFunc来包装绑定,而不必为multimap中的每个新绑定创建一个变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42100276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档