4Àå¿¡¼ ³»°¡ ÇÊ¿äÇÑ °ÍÀ» ±¸ÇöÇÏ°Ô µÇ¾ú´Ù.
C#ÀÇ Deleage³ª BoostÀÇ bind¸¦ ¿Ïº®ÇÏ°Ô ±¸Çö Çϸé ÁÁÁö¸¸, ³ª¿¡°Ô ÇÊ¿äÇÑ°Ç ¾îµð±îÁö³ª, ¹®ÀÚ¿À» ¹Þ¾Æ¼ ƯÁ¤ °´Ã¼ÀÇ ¸Þ½îµå¸¦ ½ÇÇุ ÇØÁÖ¸é µÇ¹Ç·Î ´õ ÀÌ»óÀÇ º¹ÀâÇÑ ÄÚµå´Â ÇÊ¿ä ÇÏÁö ¾Ê´Ù.
member_function_pointer1.html
member_function_pointer2.html
member_function_pointer3.html
CmdTable4.zip
À̹ø ÀåÀº À§ÀÇ ÀåµéÀ» Âü°í·Î ÇÑ ¼³¸íÀÌ´Ù.
±×·¯¹Ç·Î °£´ÜÇÏ°Ô »ç¿ë ¹æ¹ý¸¸ ¼³¸íÇÏ°Ú´Ù.
¸í·É¾î Ãß°¡
MakeCmd¸¦ ÅëÇÏ¿© ¹®ÀÚ¿°ú ¸â¹öÇÔ¼ö¸¦ ³Ñ°ÜÁÖ¸é Add()¿¡¼ cmdTable¿¡ Ãß°¡ÇÑ´Ù. ¸â¹ö ÇÔ¼ö¸¦ ¾î¶»°Ô ä¿ï °ÍÀΰ¡? ÀÌ°ÍÀº µÚ¿¡ ½ÇÁ¦ »ç¿ë¹ý¿¡¼ ¼³¸íÇÑ´Ù.
typedef std::pair<const char*, IFunctionImp*> MakeCmd;
typedef std::map<const char*, IFunctionImp*, StriLess > CmdMap;
//CmdMap cmdTable
void Command::Add( const char* strCmd, IFunctionImp* imp)
{
cmdTable.insert( MakeCmd( strCmd, imp ) );
}
|
¸í·É¾î ½ÇÇà
IFunctionImpÀÇ Process()¸¦ ½ÇÇàÇÑ´Ù. »ç¿ë¸¸ ÇÑ´Ù¸é ³»ºÎ¿¡ ¾î¶»°Ô ½ÇÇàµÇ´ÂÁö ¸ð¸£´õ¶óµµ Å©°Ô ¹®Á¦ ¾ø´Ù.
void Command::Process( char* str )
{
CmdMap::iterator iter = cmdTable.find( str );
if( iter != cmdTable.end() )
{
(iter->second)->Process();
}
}
|
½ÇÁ¦ »ç¿ë¹ý
#define MakeFunc( a, b, c ) new FunctionImp<b>( &a, &b::c)
void main()
{
Command command;
Lion lion;
command.Add( "Run", new FunctionImp<Lion>(&lion, &Lion::Run) );
Tiger tiger;
command.Add( "Idle", new FunctionImp<Tiger>(&tiger, &Tiger::Idle) );
command.Add( "Attack", MakeFunc( lion, Lion, Attack ) );
command.Process( "Run" );
command.Process( "Idle" );
command.Process( "Attack" );
}
|
command.Add( "Run", new FunctionImp<Lion>(&lion, &Lion::Run) )
"Run"Àº ¸í·ÉÀ» È£Ãâ ÇÒ ¶§ ÇÊ¿äÇÑ ¹®ÀÚ¿ÀÌ´Ù. FunctionImpÀÇ ÅÛÇø®Æ®´Â Lion, »ý¼ºÀÚ Ã¹ ¹ø° ÀÎÀÚ´Â °´Ã¼(lion), µÎ ¹ø° ÀÎÀÚ´Â ½ÇÇàÇÒ ¸Þ½îµåÀÌ´Ù.
MakeFunc µðÆÄÀι®¿¡ ÀÇÇؼ ´ÙÀ½°ú °°ÀÌ Ãß°¡ ÇÒ ¼öµµ ÀÖ´Ù.
command.Add( "Attack", MakeFunc( lion, Lion, Attack ) )
À̰͵µ º°·Î º¸±â¿£ ÁÁÁö°¡ ¾Ê´Ù. ±×³É µðÆÄÀι® ¾øÀÌ »ç¿ëÇÏ´Â°Ô ÁÁ°Ú´Ù.
¿©±â¼ ÇÑ°¡Áö È®ÀåÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.
FunctionImp¿¡ Ãß°¡ ÇÒ ¼ö ÀÖ´Â ¸Þ½îµå°¡ void Run()ÀÇ ¸Þ½îµåó·³ ¸®ÅÏ°ª°ú ÀÎÀÚ°¡ voidÇü¸¸ »ç¿ëÇØ¾ß ÇÏ´Â Á¦¾àÀÌ ÀÖ´Ù.
¿À´ÃÀº ÇÇ°ïÇؼ ¿©±â ±îÁö¸¸.....
|