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´Â ÀÌ ¿Ü¿¡ Àμö Çϳª¸¦ ÃëÇÏ´Â ¸â¹ö ÇÔ¼ö¿¡ ´ëÇÑ ·¹ÆÛµµ »ý¼ºÇÏ¸ç °¢°¢¿¡ ´ëÇØ »ó¼ö ¸â¹ö ÇÔ¼ö ¹öÀüµµ ÁغñµÇ¾î ÀÖ´Ù. ±×·¯³ª Àμö°¡ µÑ ÀÌ»óÀÎ ¸â¹ö ÇÔ¼ö¿¡ ´ëÇØ¼´Â º°µµÀÇ ·¡ÆÛ¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù.