내 요구 사항은 미리 정의 된 인수를 사용하여 나중에 실행하기 위해 일부 함수를 저장하는 것입니다. 내가 시도한 것입니다
void doSomething(int i, int j) {
std::cout << "Sum " << i + j << std::endl;
}
int main(int argc, char *argv[]) {
std::vector<std::function<void(int, int)>> functionVector;
functionVector.push_back(std::bind(doSomething, 1, 2));
functionVector.push_back(std::bind(doSomething, 4, 2));
functionVector[0]();
functionVector[1]();
}
그러나 이것은 컴파일되지 않고 다음과 같은 오류가 발생합니다.
error: no matching function for call to object of type 'std::__1::__vector_base<std::__1::function<void (int, int)>,
std::__1::allocator<std::__1::function<void (int, int)> > >::value_type' (aka 'std::__1::function<void (int, int)>')
functionVector[0]();
^~~~~~~~~~~~~~~~~
어떻게 이것을 달성 할 수 C++11/14
있습니까?
인수를 함수에 바인딩 한 후 호출은 더 이상 인수를받지 않습니다. 따라서 함수 유형은 다음 void()
과 같아야합니다 .
std::vector<std::function<void()>> functionVector;
또한 C ++ 11 이상에서 람다를 사용할 수 있으며 이는 다음보다 더 유연합니다 std::bind
.
functionVector.push_back([](){ doSomething(1, 2); });
functionVector.push_back([](){ doSomething(4, 2); });
또는 약간 단순화 된 빈 매개 변수 목록은 생략 할 수 있습니다.
functionVector.push_back([]{ doSomething(1, 2); });
functionVector.push_back([]{ doSomething(4, 2); });
보시다시피 람다는 여기에 매개 변수가 없으므로 호출 연산자의 유형은 void()
.
실제로 차이가 나지는 않지만 .NET emplace_back
대신 C ++ 11 을 사용하는 것이 좋습니다 push_back
.
push_back
는 요소 유형 (여기 std::function<void()>
)에 대한 참조를 예상 하지만 다른 것을 전달하기 때문에 std::function<void()>
는 먼저 push_back
매개 변수에 대한 임시로 생성 된 다음 이동 생성되는 벡터 요소로 구성됩니다.
emplace_back
반면에 벡터 요소에 대한 생성자 인수를 예상하고 std::function<void()>
중간 임시없이 직접 제자리에서 객체 를 생성합니다 .
이 특정 인스턴스에서는 std::function
람다를 사용할 때도 필요하지 않습니다. 캡처하지 않은 람다는 함수 포인터에 대해 감쇠하므로 다음의 간단한 대안으로 저장할 수 있습니다 std::function
.
std::vector<void(*)()> functionVector;
캡처와 함께 람다를 저장하려는 경우 std::function
접근 방식이 필요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다