C++? C++! Study+more

다음과 같은 코드를 봤더랬다.

   struct AAAA: std::unary_function<BBBB<CAA>*, void>
   {
      AAAA(
         const CPP<CAA>& PP,
         const CAA& AA
         ) :
         m_PP(PP),
         m_AA(AA)
      {}
      void operator() (BBBB<CAA>* pBBBB)
      {
         pBBBB->ANONFUNC(m_PP,m_AA);
      }
      const CPP<CAA>& m_PP;
      const CAA& m_AA;
   };

template<typename CAA> class CPP
{
...
Public:

   void CCCC(const CAA& AA) const
   {
      std::for_each(AList.begin(), AList.end(), AAAA(*this,AA));
   }
}

이 미쳐버릴것 같은 코드...- _-

우선 std::for_each가 뭔지 알아보자.
// TEMPLATE FUNCTION for_each
template<class _InIt, class _Fn1>
inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
// perform function for each element
 _DEBUG_RANGE(_First, _Last);
 _DEBUG_POINTER(_Func);
 _CHECKED_BASE_TYPE(_InIt) _ChkFirst(_CHECKED_BASE(_First));
 _CHECKED_BASE_TYPE(_InIt) _ChkLast(_CHECKED_BASE(_Last));
 for (; _ChkFirst != _ChkLast; ++_ChkFirst)
      _Func(*_ChkFirst);
 return (_Func);
 }
뭐, 위와같고...

번역을 해보면, AList의 처음부터 AList의 마지막까지 루프를 돌면서 AAAA라는 함수를 호출해 준다는건데... 좀 이상하지 않슴?
AAAA는 구조체인데-0-?

이거... 뭔소린가 싶어서 상당히 헤멨었다. (뭐.. 인터넷으로 검색한번 안때려본 내 잘못이긴 한데...;)

어쨌든, AAAA구조체의 내부를 보면 () 연산자를 오버로딩 해 놓은게 보일거다.
즉, AAAA구조체에 오버로딩 된 () 연산자를 붙여서 인자로 넘겨준거다.
() 연산자는 보는대로 pBBBB->ANONFUNC(m_PP,m_AA); 를 호출하고 있고 말이다.

뭐, 이건 그렇다 치고... 내가 궁금한건 구조체 변수가 아니라 구조체틀(?)을 인자로 넘겨버리는데, 이게 어떻게 말이 되느냐 하는거랑, AList의 갯수를 구해서 while루프를 돌면서 AAAA(*this, AA) 호출하는거랑 뭐가 다른게 있냐 하는거다.

우선 첫번째.
std::for_each(..., ..., new AAAA(...)) 이렇게 하거나 std::for_each(..., ..., AAAA var(...)) 요런식으로 클래스 인스턴스를 생성해서 넘겨야 하지 않나? 하는거다. (new AAAA 하면 멤릭 나는구나..;)

두번째는 말 그대로...
for_each의 _Func(*ChkFirst); 를 보면 다르다는게 보임;

나에게 씨뿔의 세계는 이미 안드로메다...T^T


덧글

  • Terzeron 2009/02/23 18:19 # 삭제 답글

    AAAA는 function object(functor)입니다.

    예를 들면, 특별한 정렬 조건을 주고 데이터를 정렬을 하고 싶은데, 그러면 특별한 정렬 조건에 따라 비교하는 compare function이 필요하죠. C에서는 보통 함수 포인터를 파라미터로 넘겨서 비교를 수행합니다. C++에서는 compare function을 함수로 작성하는 게 아니고 구조체(나 클래스)로 구현하고 이 구조체의 () 연산자를 구현해주는 방식을 사용합니다. 이게 바로 functor죠.

    제가 보기에 코드가 좀 이상한데, 완결성이 있는 코드가 아닌 관계로 말할 수가 없네요.
  • 승네군 2009/02/23 19:01 # 삭제 답글

    아, 제가 필요한 부분만 빼내서 이상합니다.
    잘 모르면서... 대충 빼왔더니...;;

    간략 명료한 설명 감사합니다. (__) 진짜루요..: )
댓글 입력 영역