이번 항목은 표준 라이브러리를 비판하기 위해서 있는 항목 같기도 하다. 비판의 방향은 "표준이 표준이 아닐 수 있는 것은 표준 라이브러리의 구현을 엄격히 정해 두지 않아서 이다" 로 잡고 이야기 하겠다.

이 이야기의 대표로 함수 std::mem_fun 를 들어 본다.

1. std::mem_fun은 무엇인가? 어떨 때 사용 하는가? 사례를 제시하라.

쉽게 말해서 멤버 함수를 함수 객체로 만들어 주는 binder 이고, ... 알고리즘에 쓸 때 많이 쓰인다. .. 링크로 대체 한다.

http://groups.google.com/group/han.comp.lang.c++/msg/f74a487c6b6cdf64
http://yesarang.tistory.com/101


2. 다음 코드의 주석으로 생략된 부분에 올바른 코드가 들어 있다고 할 때, 다음 표현은 유효하고 이식성 있는 C++ 코드인가? 없는 코드인가? 왜 그런지 설명하라.

책이 발간 된지 3년 정도 되었기 때문에, 지금에서야 위의 코드가 대부분 유효하고 하다고 볼 수 있을 것 같다. 여기에 대해서 책 내용을 보니, "컴파일러가 유추를 못할 수도 있기 때문"에 /*...*/ 가 있는 것이라고 했으니 말이다. 지금은 대부분 함수의 매개변수로 타입을 유추할 수 있으니, 그냥 넘어가기로 한다.

그렇다면 이 코드는 이식성이 있는 코드인가? 라는 질문으로 줄일 수 있겠다. ... 이 코드는 이식성이 없다는게 책에서의 전반적인 내용이다. 왜냐하면, 표준 라이브러리 명세에는 구현자들이 어느정도 재량으로 만들어도 된다고 되어 있기 때문이다. 그 대표적인 것이

1. 기본 매개변수들을 가진 멤버 함수를 "동등한 행동을 가진 둘 이상의 함수 서명들"로 대체할 수 있다.( 이 말을 잘 이해하지 못해서 류광님에게 질문을 했었다. 답변으로 동등한 행동을 가진 같은 이름의 함수들로 대처될 수 있다는 뜻이다. 즉, f라는 행동을 하는 함수를 f() 나 f(int) 대처될 수 있다는 뜻 이다.)

2. 멤버 함수 서명에 추가적인 기본 매개변수들은 둘 수 있다.

이 중에서 초점을 맞추어야 하는것이 두번째 것이다. "기본 개매변수들을 추가 할 수 있다" 인데, 이것 때문에, 이식성이 있을 수도, 없을 수도 있다.

그래서, "표준라이브러의 멤버 함수들을 포인터로 빼지 말 것" 으로 말 할 수 있겠다. .. 왜냐하면 표준라이브러리 구현에 따라 컴파일이 될 때도 있고 안될 때도 있기 때문이다.


총평

처음에는 boost::bind 를 쓰라. 라고 생각하고 봤었는데, 이런 깊은 뜻이. 하지만 곰곰히 생각해 보면, 이런 경우가 그렇게 많지 않다는 것을 알게 될 것이다. 게임 프로그래머만 해도 MSVC 를 대부분 사용 하기 때문이다.

.. 그래도 좋은게 좋은거니, 어느 정도 지켜야 된다는건 변함이 없겠다.

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요