함수 인수를 캡처하고 나중에 C ++ 11에서 실행하기 위해 함수 포인터를 저장하는 방법은 무엇입니까?

Abhishek bansal

내 요구 사항은 미리 정의 된 인수를 사용하여 나중에 실행하기 위해 일부 함수를 저장하는 것입니다. 내가 시도한 것입니다

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관