술어 구문은 순수 함수로 만들자


  • 술어구문(predicate)이란 bool값을 반환하는 함수를 말한다.
    ex) find_if의 매개변수인 함수 등등

  • 순수 함수란 이 함수가 반환하는 값이 그 함수의 매개변수에 종속된 함수이다.
    ex) f가 순수함수고 x, y 가 객체일때 f(x,y) 의 반환값은 x나 y의 값이 바뀔때만 변한다.

  • 술어 구문 클래스 란 operator()가 술어 구문인 클래스를 말한다.
EffectiveSTL38에 의하면 함수 객체는 값으로 전달되기 때문에 유의 해야 할 사항이 있다. 왜냐 하면 알고리즘에 함수 객체를 넘기면 알고리즘 내부에서도 다른 알고리즘을 호출함으로써 함수객체가 또 다시 복사되는 일이 일어날수 있기 때문이다.
즉 함수객체에 맴버변수가 있고 이 변수를 초기화 하여 알고리즘에 넘겼을때 알고리즘이 실행되는 중간에 이 변수가 변하고 그것이 결과에 영향을 미치는 것일 경우 알고리즘 내부에서 함수객체의 복사가 어디서 몇번이루어 지는지 알수 없기 때문에 문제가 발생할수 있다.

이 문제는 술어구문 클래스의 operator()를 const로 만듬으로써 어느정도 예방이 가능하지만 const 맴버함수라고 해도 이것저것(책참조)에 접근이 가능하며 값을 바꿀수 있기 때문에 순수 함수로 만들어야 하는 것이다.

자세한 코드는 책참조.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다