문제

나는 알아내는 데 어려움을 겪고있다 mem_fun_ref. 나는 보통 속도와 이익을 위해 상환 할 수 있기 때문에 보통 이런 종류의 기능을 사용한다는 것을 인정해야합니다. 그러나이 코드는 병목 현상이되지 않으므로이 작업을 시도하고 싶었습니다.

다음은 내가하고 싶은 일의 예입니다. 다른 방법이 있다는 것을 알고 있습니다. 사용하고 싶지 않습니다 copy, 나는 Range Member 함수를 사용하고 싶지 않으며, 사용하고 싶지 않습니다. back_inserter. 나는 구체적으로 사용하고 싶다 mem_fun_ref. 이것은 단순한 예일뿐입니다. 실제 사례는 훨씬 더 복잡합니다. 즉, 이것이 왜 잘못되었는지 잘 모르겠지만 익숙하지 않습니다. mem_fun_ref 또는 mem_fun.

내가 일하고 싶은 것은 다음과 같습니다.

#include <list>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    vector<int> b;

    // should work like magic!
    for_each(a.begin(), a.end(), bind1st(mem_fun_ref(&vector<int>::push_back), b));
}

그러나 나는 3 개의 오류가 발생합니다.

1>c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(281) : error C2529: '_Right' : reference to reference is illegal
1>c:\program files\microsoft visual studio 9.0\vc\include\functional(282) : error C2535: 'void std::binder1st<_Fn2>::operator ()(const int &(&)) const' : member function already defined or declared
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\functional(276) : see declaration of 'std::binder1st<_Fn2>::operator ()'
1>        with
1>        [
1>            _Fn2=std::mem_fun1_ref_t<void,std::vector<int>,const int &>
1>        ]

reference to reference is illegal 함수가 값별로 매개 변수를 가져와야한다고 생각하게합니다. 그러나 물론 이것은 변화가 불가능합니다. vector, 내 코드에서도 변경할 수 없습니다. 이것을 작동시키기위한 간단한 변화가 있습니까? 1 라이너 인 솔루션이 필요합니다.

도움이 되었습니까?

해결책

그냥 사용하십시오 bind. 그만큼 mem_fun 버전이 너무 어렵습니다.

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, boost::ref(b), _1));

사용이 필요하지 않은 또 다른 방법 ref 수정할 벡터에 대한 포인터를 전달하는 것입니다.

for_each(a.begin(), a.end(),
  boost::bind(&vector<int>::push_back, &b, _1));

다른 팁

이 문제는 28-30 페이지 Herb Sutter의 "Exceptional C ++ 스타일"으로 설명되었습니다. 아마도 하나는 안전하게 포인터를 만들 수 없을 것입니다 vector<int>::push_back 메소드는 멤버 함수의 정확한 서명을 확인 해야하는 방법으로 vector<int>::push_back 표준 라이브러리에서. (표준 라이브러리에서) :이기 때문입니다.

  1. 기본 매개 변수가있는 멤버 함수 서명은 동일한 동작을 가진 두 개 이상의 멤버 함수 서명으로 대체 될 수 있습니다.
  2. 멤버 기능 서명에는 추가 기본 매개 변수가있을 수 있습니다.

결국 허브 셔터는이를 조언했다

  1. 표준 라이브러리가 아닌 MEM_FUN을 사용하십시오
  2. 표준 라이브러리가 아닌 회원 기능에 대한 포인터 사용

나는 당신이 사용하고 싶지 않다고 말한다는 것을 알고 있습니다. back_inserter, 아마도 단순화 된 예제 코드를 제공했기 때문일 것입니다.

어떻게 해야할지 궁금해하는 다른 사람에게 바로 그거죠 당신이하려고하는 일과 그것을 사용하는 것은 사용합니다. back_inserter:

std::copy(a.begin(), a.end(), std::back_inserter(b));

즉, 항상 있습니다 other_mem_fun, 나는 부스트에 대해 알기 전에 요리했다. 이것은 적합 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top