0
나는 다음과 같은 코드가 있습니다표준 : : 바인드 :: 바인드
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))
}
});
내가 std::function<void(ASwatterFly*)> >
에서 std::function<void(void)> >
로 변환하는 또 다른 결합의 내부 결합을합니다. 이 스 니펫 코드는 컴파일되지 않습니다. 그러나 바인딩을 변수로 이동하여 다음과 같이 전달하면 다음과 같이 전달됩니다.
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)
}
});
이 작동합니다. 컴파일 할 때 두 번째 바인드를 변수로 전달해야하는 이유는 무엇입니까?
내 문제는 아마도 std :: bind는 첫 번째 예제에서 사용한 경우 반환 유형이 무엇인지 추론 할 수 없다는 것을 깨달았습니다. 이제 std :: bind를 다음과 같이 캐스팅하려고했습니다 : 'std :: function (std :: bind (& ASwatterLevelBase :: ShootAndScootMisdirection, this, std :: placeholders :: _ 1, FVector2D 오류가 발생했습니다 : '오류 C4868 : 컴파일러가 braced initializer 목록에서 왼쪽에서 오른쪽으로 평가 순서를 시행하지 않습니다. ' 어떻게하면 std를 명시 적으로 캐스팅 할 수 있습니까? ::묶다? –
Rael
이제 생각해 보았지만 첫 번째 std :: bind가 올바르게 평가되었으므로 지금도 확실하지 않습니다. – Rael
알았어, [이 질문에 대한 답변] (http://stackoverflow.com/questions/25841857/vc2013-function-from-bind-not-compiling/25842919#25842919)이 문제가 될 것 같습니다. 그리고 첫 번째 예제가 작동하지 않는 이유를 설명 할 것입니다. 왜냐하면 바인딩에 인수 인 바인딩 인 경우 std :: function으로 포장해야하기 때문입니다. 그러나 그것은 캐스팅에 관한 나의 이전 코멘트로 돌아 간다. std :: function에 바인딩을 래핑하면 어떻게 컴파일 될까요? – Rael