2010-04-04 3 views
3

제목에 명시된 것을 구현하는 방법이 궁금합니다. 내가 좋아하는 뭔가를 시도했습니다 ...std :: for_each 1 인수가있는 멤버 함수

std::for_each(a.begin(), a.end(), std::mem_fun_ref(&myClass::someFunc))

하지만 1 개 인자로 함수에 평가하지 않는다 "용어"(나는 "m이 가정은 3 인수를 의미) 없다는 오류 심지어 someFunc하지만 하나 개의 인수를 않습니다 - a에 저장된 객체의 유형을

을 내가 내가 할 노력하고있어하는 표준 라이브러리 (내가 아는를 사용하여 가능하면 궁금하네요 내가 부스트를 사용하여 쉽게 할 수 있습니다.)

추 신 : for_each 및을 사용합니다.은 수동으로 a을 반복하고 객체를 someFunc으로 전달하는 것과 비교할 때 성능상의 영향이 있습니까?

답변

2

someFunc는 하나의 매개 변수가있는 멤버이지만 mem_fun_ref는 "myClass"의 암시 적 첫 번째 인수를 사용합니다. 벡터의 항목을 두 번째 인수로 사용하려고합니다.

for_each와 mem_fun_ref를 사용했을 때 성능에 부정적인 영향을 미칠 가능성은 거의 없습니다. 컴파일러는 비슷한 코드를 생성합니다. 그러나 확실한 유일한 방법은 벤치 마크입니다.

std::for_each(a.begin(), a.end(), 
       std::bind1st(
        std::mem_fun_ref(&MyClass::SomeFunc), 
        my_class)); 
+0

bind2nd를 사용한다고 가정합니다. 이제는 반복에서 현재 요소를 사용하도록 지정하는 방법을 생각하고 있습니다. 나는 단지 부스트를 사용할 것이라고 생각한다. – Person

+0

Nope은 여전히 ​​bind1st를 사용한다. mem_fun_ref는 두 개의 인수를 갖는 함수가됩니다. 첫 번째는 MyClass이고, 두 번째는 멤버 함수 param입니다. 첫 번째 인수를 mem_fun_ref에 바인드하여 클래스 인스턴스에 바인딩하려고합니다. – Stephen

+1

@Person : Boost를 사용하려면 foreach 매크로를 사용하는 것이 좋습니다. 'std :: for_each'는 단순히 실패한 아이디어 였고, 더 많은 확산을 위해 종종 코드를 읽는 것이 더 어렵습니다. – GManNickG

1

숨겨진 "this"인수를 제공하려면 bind_1st를 사용해야한다고 생각합니다. 또는 "this"인수가 유일한 인수라는 것을 의미합니까? someFunc에는 자체 매개 변수가 없습니다.

+0

someFunc에는 하나의 매개 변수가 있습니다. myClass :: someFunc (someType)과 같습니다. – Person

관련 문제