38-2-¸¶.¸â¹ö ÇÔ¼ö ¾î´ðÅÍ

ptr_funÀº ÀÏ¹Ý ÇÔ¼ö¸¦ ÇÔ¼ö °´Ã¼·Î ¸¸µå´Âµ¥ ºñÇØ mem_funÀº Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¸¦ ÇÔ¼ö °´Ã¼·Î ¸¸µç´Ù. ¸â¹ö ÇÔ¼ö´Â ¹Ýµå½Ã this¿Í ÇÔ²² È£ÃâµÇ¾î¾ß ÇÑ´Ù´Â Á¡¿¡¼­ ÇÔ¼ö Æ÷ÀÎÅͿ͵µ ´Ù¸¥µ¥ mem_funÀº ÀÌ°ÍÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸ÀÚ.

 

¿¹ Á¦ : mem_fun

#include <iostream>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

class Natural

{

private:

     int num;

 

public:

     Natural(int anum) : num(anum) {

          SetNum(anum);

     }

     void SetNum(int anum) {

          if (anum >= 0) {

              num=anum;

          }

     }

     int GetNum() { return num; }

     bool IsEven() { return num % 2 == 0; }

};

 

void delnatural(Natural *pn)

{

     delete pn;

}

 

void main()

{

     vector<Natural *> vn;

     vn.push_back(new Natural(1));

     vn.push_back(new Natural(2));

     vn.push_back(new Natural(3));

     vn.push_back(new Natural(4));

 

     vector<Natural *>::iterator it;

     for (it=vn.begin();;it++) {

          it=find_if(it, vn.end(), mem_fun(&Natural::IsEven));

          if (it==vn.end()) break;

          cout << (*it)->GetNum() << "ÀÌ(°¡) ÀÖ´Ù" << endl;

     }

     for_each(vn.begin(),vn.end(),delnatural);

}

 

Natural Ŭ·¡½º´Â 0 ÃÊ°úÀÇ ÀÚ¿¬¼ö¸¦ Ç¥ÇöÇϴµ¥ ¦¼öÀÎÁö¸¦ ÆǺ°ÇÏ´Â IsEven Á¶°ÇÀÚ°¡ Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö·Î ÀÛ¼ºµÇ¾î ÀÖ´Ù. ÀÌ ¸â¹ö ÇÔ¼ö¸¦ Á¶°ÇÀÚ ÇÔ¼ö °´Ã¼·Î ¸¸µé±â À§ÇØ mem_fun ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. mem_funÀº ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅ͸¦ ĸ½¶È­ÇÏ¿© ÇÔ¼ö °´Ã¼·Î ¸¸µå´Â °´Ã¼¸¦ »ý¼ºÇϸç ÀÌ °´Ã¼ÀÇ () ¿¬»êÀÚ¸¦ ÅëÇØ ÄÁÅ×À̳ʿ¡ ÀúÀåµÈ °¢ °´Ã¼ Æ÷ÀÎÅÍ(this)¿Í ÇÔ²² ¸â¹ö ÇÔ¼ö°¡ È£ÃâµÈ´Ù.

¸â¹ö ÇÔ¼ö¸¦ °´Ã¼·Î ĸ½¶È­ÇÏ´Â ¿ø¸®µµ ptr_fun°ú ºñ½ÁÇÏ´Ù. ¸â¹ö ÇÔ¼ö¿¡ ´ëÇÑ ·¡ÆÛ´Â Àμö¸¦ ÃëÇÏÁö ¾Ê´Â ¸â¹ö ÇÔ¼ö¿Í Àμö Çϳª¸¦ ÃëÇÏ´Â ¸â¹ö ÇÔ¼ö¿¡ ´ëÇØ °¢°¢ ÀÛ¼ºµÇ¾î ÀÖÀ¸¸ç ÀÌ °´Ã¼¸¦ ¸¸µå´Â mem_fun ÇÔ¼ö´Â µÎ °´Ã¼¿¡ ´ëÇØ ¿À¹ö·ÎµùµÇ¾î ÀÖ´Ù. Àμö¸¦ ÃëÇÏÁö ¾Ê´Â ¹öÀü¿¡ ´ëÇؼ­¸¸ ¿¬±¸ÇØ º¸ÀÚ.

 

template<class Result, class T>

mem_fun_t<Result, T> mem_fun(Result (T::*Pm)())

{

     return (mem_fun_t<Result, T>(Pm));

}

 

T ŸÀÔÀÇ ¸â¹ö ÇÔ¼ö Pm¿¡ ´ëÇÑ ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¹Þ¾Æ »ý¼ºÀÚ·Î ÀÌ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ³Ñ°Ü mem_fun_t °´Ã¼¸¦ »ý¼ºÇÏ¿© ±× °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. mem_fun_t Ŭ·¡½º´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

 

template<class Result,class T>

class mem_fun_t : public unary_function<T *, Result>

{

public:

     explicit mem_fun_t(Result (T::*Pm)()) : Pmemfun(Pm) {}

     Result operator()(T *pObj) const {

          return ((pObj->*Pmemfun)());

     }

private:

     Result (T::*Pmemfun)();

};

 

¸®ÅÏ Å¸ÀÔ°ú Ŭ·¡½º ŸÀÔÀ» Àμö·Î Àü´Þ¹ÞÀ¸¸ç ³»ºÎ¿¡ Àμö¸¦ ÃëÇÏÁö ¾Ê´Â ¸â¹ö ÇÔ¼ö Æ÷ÀÎÅ͸¦ PmemfunÀ̶ó´Â À̸§ÀÇ ¸â¹ö º¯¼ö·Î ¼±¾ðÇØ µÎ¾ú´Ù. »ý¼ºÀÚ¿¡¼­´Â ÀÌ ¸â¹ö ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ Àü´Þ¹Þ¾Æ Pmemfun ¸â¹ö¿¡ ´ëÀÔÇØ µÐ´Ù. ±×¸®°í () ¿¬»êÀÚ´Â Àμö·Î Àü´ÞµÈ *pObj °´Ã¼ Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ÄÁÅ×À̳ʿ¡ ÀúÀåµÈ ¿ä¼Ò°¡ °´Ã¼ÀÇ Æ÷ÀÎÅÍÀ̹ǷΠfind_if¿¡ ÀÇÇØ °¢ °´Ã¼ÀÇ ¸â¹ö ÇÔ¼öµéÀÌ È£ÃâµÉ °ÍÀÌ´Ù.

¸¸¾à ÄÁÅ×À̳ʰ¡ °´Ã¼ÀÇ Æ÷ÀÎÅÍ°¡ ¾Æ´Ï¶ó °´Ã¼ ±× ÀÚü¸¦ ÀúÀåÇÏ°í ÀÖ´Ù¸é À̶§´Â mem_fun_ref¸¦ »ç¿ëÇÑ´Ù. À§ ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ º¯ÇüÇصµ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù. °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ µ¿ÀûÀ¸·Î »ý¼ºÇÑ °ÍÀÌ ¾Æ´Ï¹Ç·Î delete´Â ÇÒ ÇÊ¿ä¾ø´Ù.

 

void main()

{

     vector<Natural> vn;

     vn.push_back(Natural(1));

     vn.push_back(Natural(2));

     vn.push_back(Natural(3));

     vn.push_back(Natural(4));

 

     vector<Natural>::iterator it;

     for (it=vn.begin();;it++) {

          it=find_if(it, vn.end(), mem_fun_ref(&Natural::IsEven));

          if (it==vn.end()) break;

          cout << (*it).GetNum() << "ÀÌ(°¡) ÀÖ´Ù" << endl;

     }

}

 

mem_fun_ref´Â mem_fun_ref_t °´Ã¼¸¦ »ý¼ºÇϴµ¥ ÀÌ °´Ã¼´Â ¸â¹öÀÇ ÂüÁ¶·ÎºÎÅÍ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. mem_fun°ú mem_fun_ref´Â ÀÌ ¿Ü¿¡ Àμö Çϳª¸¦ ÃëÇÏ´Â ¸â¹ö ÇÔ¼ö¿¡ ´ëÇÑ ·¹ÆÛµµ »ý¼ºÇÏ¸ç °¢°¢¿¡ ´ëÇØ »ó¼ö ¸â¹ö ÇÔ¼ö ¹öÀüµµ ÁغñµÇ¾î ÀÖ´Ù. ±×·¯³ª Àμö°¡ µÑ ÀÌ»óÀÎ ¸â¹ö ÇÔ¼ö¿¡ ´ëÇؼ­´Â º°µµÀÇ ·¡ÆÛ¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù.