2017-02-07 16 views
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) 
    } 
}); 

이 작동합니다. 컴파일 할 때 두 번째 바인드를 변수로 전달해야하는 이유는 무엇입니까?

+0

내 문제는 아마도 std :: bind는 첫 번째 예제에서 사용한 경우 반환 유형이 무엇인지 추론 할 수 없다는 것을 깨달았습니다. 이제 std :: bind를 다음과 같이 캐스팅하려고했습니다 : 'std :: function (std :: bind (& ASwatterLevelBase :: ShootAndScootMisdirection, this, std :: placeholders :: _ 1, FVector2D 오류가 발생했습니다 : '오류 C4868 : 컴파일러가 braced initializer 목록에서 왼쪽에서 오른쪽으로 평가 순서를 시행하지 않습니다. ' 어떻게하면 std를 명시 적으로 캐스팅 할 수 있습니까? ::묶다? – Rael

+0

이제 생각해 보았지만 첫 번째 std :: bind가 올바르게 평가되었으므로 지금도 확실하지 않습니다. – Rael

+0

알았어, [이 질문에 대한 답변] (http://stackoverflow.com/questions/25841857/vc2013-function-from-bind-not-compiling/25842919#25842919)이 문제가 될 것 같습니다. 그리고 첫 번째 예제가 작동하지 않는 이유를 설명 할 것입니다. 왜냐하면 바인딩에 인수 인 바인딩 인 경우 std :: function으로 포장해야하기 때문입니다. 그러나 그것은 캐스팅에 관한 나의 이전 코멘트로 돌아 간다. std :: function에 바인딩을 래핑하면 어떻게 컴파일 될까요? – Rael

답변

0

내 질문의 의견 중 하나에서 언급했듯이 this question에 대한 대답은 왜 이런 일이 일어 났는지에 대한 이유였습니다. 내가하고 싶었던 것은 새로운 변수를 매번 생성하지 않고 바인드 내부에 바인드 인자를 추가 할 수 있다는 것이 었습니다. 나는이 작업을 수행하여 적절한 해결책을했다 :

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. 
}); 

그래서 난 그냥 multimap은 각 새로운 바인딩에 대한 변수를 만들 필요없이 바인드를 포장 DummyFunc를 사용할 수 있습니다.