¦Ë¥Õ¥¡¥ó¥¯¥¿¤òÊÑ¿ô¤Ë³ÊǼ¤¹¤ë¤ÈÅÔ¹ç¤Î¤¤¤¤¾ì¹ç¤¬¤¢¤ë¡£ ¤·¤«¤·¡¢ºÇ¤âñ½ã¤Ê¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î·¿¤Ç¤¢¤Ã¤Æ¤â¡¢Ä¹¤¯¡¢°·¤¤¤Ë¤¯¤¤¡£ ¤½¤·¤Æ¡¢°ìÈÌŪ¤Ë¤Ï¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î·¿¤ÎÊÑ¿ô¤òÀë¸À¤¹¤ë¤³¤È¤Ï¼Â¸½ÉÔ²Äǽ¤Ç¤¢¤ë¡£ Boost Function ¥é¥¤¥Ö¥é¥ê [function] ¤Ï¡¢Î㤨¤Ð¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î¤è¤¦¤ÊǤ°Õ¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Î¥é¥Ã¥Ñ¤òÄêµÁ¤¹¤ë¡£ ¤³¤ì¤é¤Î¥é¥Ã¥Ñ¤Î·¿¤Ïµ½Ò¤·¤ä¤¹¤¤¡£ °Ê²¼¤ËÎã¤ò¼¨¤¹¡£
boost::function<int(int, int)> f = _1 + _2; boost::function<int&(int&)> g = (_1 += 10); int i = 1, j = 2; f(i); // returns 3 g(i); // sets i to = 11;¥é¥Ã¥×¤µ¤ì¤ë´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ÎÊÖ¤êÃͤȰú¿ô¤Î·¿¤Ï¡¢¥é¥Ã¥Ñ¥Æ¥ó¥×¥ì¡¼¥È boost::function ¤Î¥Æ¥ó¥×¥ì¡¼¥È°ú¿ô¤È¤·¤ÆÌÀ¼¨Åª¤Ëµ½Ò¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ ¥é¥Ã¥×¤µ¤ì¤ë´Ø¿ô¤¬¡¢ÌÀ¼¨¤µ¤ì¤Ê¤±¤ì¤ÐÈÆÍÑŪ¤Ê°ú¿ô¤ò¤È¤ë¤È¤¤Ç¤¢¤Ã¤Æ¤âƱÍͤǤ¢¤ë¡£ boost::function ¤Ç´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ò¥é¥Ã¥×¤¹¤ë¤È¡¢²¾ÁÛ´Ø¿ô¤Î½èÍý¤ÈƱÅù¤Ê¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¥³¥¹¥È¤¬À¸¤¸¤Æ¤·¤Þ¤¦¡£ ¤·¤«¤·¡¢¼ÂºÝ¤Ë¤Ï²¾ÁÛ´Ø¿ô¤ò»ÈÍѤ·¤Æ¤¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡£ ¤Þ¤¿¡¢boost::function Ãæ¤Ë¦Ë¥Õ¥¡¥ó¥¯¥¿¤ò³ÊǼ¤¹¤ë¤³¤È¤Ï´í¸±¤Î¸¶°ø¤È¤Ê¤ê¤¦¤ë¡£ ¤¢¤ë¼ï¤Î¦Ë¥Õ¥¡¥ó¥¯¥¿¤Ï¡¢¦Ë¼°¤Î°ú¿ô¤Î¥³¥Ô¡¼¤ò¤È¤ëÂå¤ï¤ê¤Ë¡¢Â«ÇûÊÑ¿ô¤Ø¤Î»²¾È¤ò³ÊǼ¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡£ SLT ¥¢¥ë¥´¥ê¥º¥à¤Î¸Æ½Ð¤·¤¬´°Î»¤·¤¿Ä¾¸å¤Ë¦Ë¥Õ¥¡¥ó¥¯¥¿¤ÏÇË´þ¤µ¤ì¤ë¤¿¤á¡¢STL ¥¢¥ë¥´¥ê¥º¥à¤Î¸Æ½Ð¤·¤Ç¡¢°ì»þŪ¤Ê¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¾ï¤Ë°ÂÁ´¤Ç¤¢¤ë¡£ ¤·¤«¤·¡¢boost::function ¤ÎÆâÉô¤Ë¥é¥Ã¥×¤µ¤ì¤¿¦Ë¥Õ¥¡¥ó¥¯¥¿¤Ï¡¢¤µ¤é¤ËÀ¸Â¸¤·Â³¤±¤ë¤«¤â¤·¤ì¤Ê¤¤¡¢¤½¤·¤ÆÌµ¸ú¤Ê»²¾È¤ò»ý¤Ä²ÄǽÀ¤òºî¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¤¢¤ë¡£ °Ê²¼¤Ë¡¢Îã¤ò¼¨¤¹¡£
int* sum = new int(); *sum = 0; boost::function<int&(int)> counter = *sum += _1; counter(5); // ok, *sum = 5; delete sum; counter(3); // error, *sum does not exist anymore
Boost Bind [bind] ¥é¥¤¥Ö¥é¥ê¤ÏÉôʬŪ¤Ë BLL ¤Îµ¡Ç½¤È½ÅÊ£¤¹¤ë¡£ ´ðËÜŪ¤Ë¤Ï¡¢Boost Bind ¥é¥¤¥Ö¥é¥ê(°Ê¹ß BB)¤Ç¤Ï¡¢BLL ¤Î°ìÉô¤Î bind ¼°¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤È¤¤¤¨¤ë¡£ ¤·¤«¤·¡¢¤¤¤¯¤Ä¤«°Ọ̃Ū¤Ë°Û¤Ê¤ëÉôʬ¤â¤¢¤ë¡£
BLL ¤È BB ¤ÏÊÌ¡¹¤ËȯŸ¤·¡¢°Û¤Ã¤¿¼ÂÁõ¤È¤Ê¤Ã¤Æ¤¤¤ë¡£ ¤½¤Î¤¿¤á¡¢BB ¤Î bind ¼°¤Ï BLL ¤Î bind ¼°¡¢Â¾¤Î·Á¤Î¦Ë¼°¤ÎÆâÉô¤Ç¤Ï»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£ ƱÍͤˡ¢BB ¤Ë¤ª¤¤¤Æ BLL ¤Î bind ¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤¤Ê¤¤¡£ ¤·¤«¤·¡¢BB ¥é¥¤¥Ö¥é¥ê¤Î̾Á°¤Ï¡¢Ì¾Á°¶õ´Ö boost ¤Ë¸ºß¤¹¤ë¤Î¤ËÂФ·¡¢ BLL ¤Î̾Á°¤Ï¡¢Ì¾Á°¶õ´Ö boost::lambda ¤Ë¸ºß¤¹¤ë¤¿¤á¡¢ ¤³¤ì¤é¤ÎÆó¤Ä¤Î¥é¥¤¥Ö¥é¥ê¤Ï¶¦Â¸¤Ç¤¤ë¡£
BLL ¤Ï¤¢¤ëÄøÅÙ C++ ɸ½à¤Ë½ç±þ¤Ê¥³¥ó¥Ñ¥¤¥é¤¬É¬ÍפǤ¢¤ë¤Î¤ËÂФ·¡¢ BB ¥é¥¤¥Ö¥é¥ê¤Ï¤è¤ê¥Ý¡¼¥¿¥Ö¥ë¤Ê¥³¥ó¥Ñ¥¤¥é¤Ç½½Ê¬¤Ç¤¢¤ê¡¢¤è¤ê¿¤¯¤Î¥³¥ó¥Ñ¥¤¥é¤Çµ¡Ç½¤¹¤ë¡£
°Ê¹ß¤ÎÆó¤Ä¤Î¥µ¥Ö¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢ BB ¤È BLL ¤Ë¤ª¤±¤ë bind ¼°¤Î°Ọ̃Ū¤ÊÁê°ã¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡£
template<class F> int foo(const F& f) { int x; .. bind(f, _1)(x); ... }
int bar(int, int); nested(bind(bar, 1, _1));foo ¤ÎÆâÉô¤Î bind ¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡£
bind(bind(bar, 1, _1), _1)(x)BLL ¤Ë¤ª¤¤¤Æ¤Ï¡¢¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë²ò¼á¤µ¤ì¤ë¡£
bar(1, x)(x)°ìÊý¡¢BB ¤Ë¤ª¤¤¤Æ¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡£
bar(1, x)BLL ¤Ç¤Ï¤³¤Îµ¡Ç½¤ò¼Â¸½¤¹¤ë¤¿¤á¡¢Section 5.9.1.1 ¤ÇÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¢´Ø¿ô foo ¤ÎÆâÉô¤Î bind ¼°¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤³¤È¤¬²Äǽ¤Ç¤¢¤ë¡£
bind(unlambda(f), _1)(x);
BLL ¤Ç¤Ï»°¤Ä¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤·¤«ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¤Î¤ËÂФ·¡¢ BB ¥é¥¤¥Ö¥é¥ê¤Ï¶å¤Ä¤Þ¤Ç¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¡£ ¤³¤ì°Ê¾å¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤òÄ󶡤·¤Ê¤¤º¬µò¤Ï¡¢¤¤¤«¤Ê¤ë STL ¥¢¥ë¥´¥ê¥º¥à¤Ç¼õÍý¤Ç¤¤ë´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ÎºÇ¿¤Î°ú¿ô¤Î¿ô¤ÏÆó¤Ä¤Ç¤¢¤ë¤³¤È¤Ç¤¢¤ë¡£ BB ¥é¥¤¥Ö¥é¥ê¤Ë¤ª¤¤¤Æ¥×¥ì¡¼¥¹¥Û¥ë¥À¤Î¿ô¤Ï´Êñ¤ËÁý²Ã¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤ë¡£ BLL ¤Ç¤â²Äǽ¤Ç¤¢¤ë¤¬¡¢¤·¤«¤·¤è¤ê¿¤¯¤ÎÏ«ÎϤòɬÍפȤ¹¤ë¡£ ¸½ºß BLL ¤Ï¼Â°ú¿ô¤òÆâÉôŪ¤Ë¦Ë¥Õ¥¡¥ó¥¯¥¿¤Ë¤½¤Î¤Þ¤ÞÅϤ·¤Æ¤ª¤ê¡¢ ¥¿¥×¥ë¤Ë¥é¥Ã¥×¤·¤¿¤ê¤Ï¤·¤Ê¤¤¡£ ¤³¤ì¤Ï¡¢¹¤¯»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¤¤¯¤Ä¤«¤Î¥³¥ó¥Ñ¥¤¥é¤¬ºÇŬ²½¤Ë¤ª¤¤¤ÆÃæ´Ö¤Î¥¿¥×¥ë¤ò¼è¤êµî¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¤¿¤á¤Ç¤¢¤ë¡£ Ãæ´Ö¤Î¥¿¥×¥ë¤ÎÀ¸À®¤Ï¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë½ÅÂç¤Ê±Æ¶Á¤òÍ¿¤¨¤Æ¤·¤Þ¤¦¡£ ÆÃ¤Ë¡¢Ã±½ã¤Ê(¤½¤·¤ÆºÇ¤â°ìÈ̤Ê)¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î¾ì¹ç¤Ë¤Ï½ÅÍפǤ¢¤ë¡£ ¤½¤·¤Æ¡¢¤è¤ê¿¤¯¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤â²Äǽ¤Ç¤¢¤ë¤¬¡¢Ã±½ã¤Ê¦Ë¥Õ¥¡¥ó¥¯¥¿¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë´Ø¤·¤ÆÂŶ¨¤·¤Ê¤¤ÀÞÃï°Æ¤òÁªÂò¤·¤¿¡£