다음과 같은 코드를 봤더랬다.
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 # 삭제 답글
아, 제가 필요한 부분만 빼내서 이상합니다.잘 모르면서... 대충 빼왔더니...;;
간략 명료한 설명 감사합니다. (__) 진짜루요..: )