¸½ºß¤Ç¤Ï C++ ɸ½à¥é¥¤¥Ö¥é¥ê[C++98]¤Î°ìÉô¤È¤Ê¤Ã¤Æ¤¤¤ëɸ½à¥Æ¥ó¥×¥ì¡¼¥È¥é¥¤¥Ö¥é¥ê (STL)[STL94] ¤ÏÈÆÍѤΥ³¥ó¥Æ¥Ê¤È¥¢¥ë¥´¥ê¥º¥à¤Î¥é¥¤¥Ö¥é¥ê¤Ç¤¢¤ë¡£°ìÈÌŪ¤Ë¤Ï STL ¥¢¥ë¥´¥ê¥º¥à¤Ï¥³¥ó¥Æ¥Ê¤ÎÍ×ÁǤò´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ò²ð¤·¤ÆÁàºî¤¹¤ë¡£¤³¤ì¤é¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ï¥¢¥ë¥´¥ê¥º¥à¤Ë°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¡£
´Ø¿ô¸Æ¤Ó½Ð¤·¤Îʸˡ¤Ë½¾¤Ã¤Æ¸Æ½Ð¤µ¤ì¤ë¤¤¤«¤Ê¤ë C++ ¤Î¹½Â¤¤â´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£ STL ¤Ë¤Ï¤¤¤¯¤Ä¤«¤Î°ìÈÌŪ¤ÊÍÑÅӤΤ¿¤á¤Ë¡¢´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤¬¤¢¤é¤«¤¸¤áÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£(plus¡¢less¡¢not1¤Ê¤É¤¬¤¢¤ë) Î㤨¤Ð¡¢plus ¤Îɸ½àŪ¤Ê¼ÂÁõ¤Î°ì¤Ä¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡£
template <class T> : public binary_function<T, T, T> struct plus { T operator()(const T& i, const T& j) const { return i + j; } };´ðÄ쥯¥é¥¹¤Î binary_function<T, T, T> ¤Ë¤Ï¡¢´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Î°ú¿ô¤ÈÊÖ¤êÃͤη¿¤Î¤¿¤á¤Î typedef ¤¬Â¸ºß¤¹¤ë¡£¤½¤ì¤é¤Î typedef ¤Ï´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ò
¾å¤Ëµó¤²¤¿¤è¤¦¤Ê´ðËÜŪ¤Ê´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ë²Ã¤¨¤Æ¡¢Å¬¹ç²Äǽ¤ÊÆó¹à´Ø¿ô¤Î°ú¿ô¤Î°ì¤Ä¤òÄê¿ô¤ËÄê¤á¤ÆÃ±¹à´Ø¿ô¤òºî¤ë¤¿¤á¤Î ¥Ð¥¤¥ó¥À ¥Æ¥ó¥×¥ì¡¼¥È¤â¸ºß¤¹¤ë¡£ Î㤨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤òÌÀ¼¨Åª¤Ëµ½Ò¤·¤Ê¤¯¤È¤â plus¥Æ¥ó¥×¥ì¡¼¥È¤È¥Ð¥¤¥ó¥À¥Æ¥ó¥×¥ì¡¼¥È¤Î°ì¤Äbind1st¤ò»ÈÍѤ·¤ÆÅù²Á¤Êµ¡Ç½¤ò¼Â¸½¤Ç¤¤ë¡£
class plus_1 { int _i; public: plus_1(const int& i) : _i(i) {} int operator()(const int& j) { return _i + j; } };°Ê²¼¤ÎÆó¤Ä¤Î¼°¤ÏƱ°ì¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤¹¤ë¡£ ¤Ä¤Þ¤ê¡¢¸Æ½Ð¤µ¤ì¤¿¤È¤ÁÐÊý¤È¤â´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Î°ú¿ô¤Ë1¤ò²Ã¤¨¤¿·ë²Ì¤òÊÖ¤¹¡£
plus_1(1) bind1st(plus<int>(), 1)¸å¤Î¼°¤ÎÉôʬ¼° plus<int>() ¤ÏÆó¤Ä¤ÎÀ°¿ô¤Î¹ç·×¤ò·×»»¤¹¤ëÆó¹à´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¡£¤½¤·¤Æ¡¢
transform(a.begin(), a.end(), ostream_iterator<int>(cout), bind1st(plus<int>(), 1));
binder ¥Æ¥ó¥×¥ì¡¼¥È¤ò¤è¤ê°ìÈÌŪ¤ËŬÍѤǤ¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢STL ¤Ï´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ä»²¾È¡¢¥á¥ó¥Ð´Ø¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤òŬ¹ç²Äǽ¤Ë¤¹¤ë ¥¢¥À¥×¥¿ ¤òÄ󶡤·¤Æ¤¤¤ë¡£ ¤µ¤é¤Ë¡¢É¸½à¤Î»ÅÍͤò³ÈÄ¥¤·¤¿´Ø¿ô¤Î¹çÀ®Áàºî¤ò´Þ¤à STL ¤Î¼ÂÁõ¤â¤¢¤ë [SGI02]¡£
¤³¤ì¤é¤¹¤Ù¤Æ¤Î¼êÃʤÎÌÜɸ¤Ï°ì¤Ä¤Ç¤¢¤ë¡£ STL ¥¢¥ë¥´¥ê¥º¥à¤Î¸Æ½Ð¤·¤ÎÃæ¤Ç̵̾´Ø¿ô¤ò»ØÄê¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ç¤¢¤ë¡£ ¸À¤¤´¹¤¨¤ë¤È¡¢¥³¡¼¥É¤Î°ìÉô¤ò´Ø¿ô¤Ø¤Î°ú¿ô¤È¤·¤ÆÅϤ¹¤³¤È¤Ç¤¢¤ë¡£ ¤·¤«¤·¡¢¤³¤ÎÌÜɸ¤ÏÉôʬŪ¤Ë¤·¤«¼Â¸½¤Ç¤¤Ê¤¤¡£ ¾å¤Îñ½ã¤ÊÎã¤ò¸«¤Æ¤âʬ¤«¤ëÄ̤ꡢɸ½à¤Î¼êÃʤòÍѤ¤¤¿ÌµÌ¾´Ø¿ô¤ÎÄêµÁ¤Ï°·¤¤¤Ë¤¯¤¤¡£ ¥Õ¥¡¥ó¥¯¥¿¤ä¡¢¥¢¥À¥×¥¿¡¢¥Ð¥¤¥ó¥À¤ä´Ø¿ô¹çÀ®Áàºî¤ò´Þ¤àÊ£»¨¤Ê¼°¤ÏÍý²ò¤·¤Ë¤¯¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡£ ¤½¤ì¤Ë²Ã¤¨¡¢É¸½à¤Î¼êÃʤòŬÍѤ¹¤ë¤Î¤Ë½ÅÍפÊÀ©¸Â¤¬¤¢¤ë¡£ ɸ½à¤Î¥Ð¥¤¥ó¥À¤Ç¤Ï¡¢Æó¹à´Ø¿ô¤Î°ú¿ô¤Î¤¦¤Á¤Î°ì¤Ä¤·¤«Â«Çû¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¡£ 3 °ú¿ô¡¢4 °ú¿ô¤È¤¤¤Ã¤¿ 3 ¤Ä°Ê¾å°ú¿ô¤ò¤È¤ë´Ø¿ô¤Î¤¿¤á¤Î¥Ð¥¤¥ó¥À¤¬Â¸ºß¤·¤Ê¤¤¤Î¤Ç¤¢¤ë¡£
Boost Lambda Library ¤Ï¾åµ¤Î¤è¤¦¤ÊÌäÂê¤ò²ò·è¤¹¤ë¡£
ľ´ÑŪ¤Êʸˡ¤Ë¤è¤Ã¤Æ´Êñ¤Ë̵̾´Ø¿ô¤òºîÀ®¤Ç¤¤ë¡£ ¾åµ¤ÎÎã¤Ï¼¡¤Î¤è¤¦¤Ëµ½Ò¤Ç¤¤ë¡£
transform(a.begin(), a.end(), ostream_iterator<int>(cout), 1 + _1);¤Þ¤¿¤Ï¡¢¤è¤êľ´ÑŪ¤Ë
for_each(a.begin(), a.end(), cout << (1 + _1));
°ú¿ô¤Î«Çû¤Ë´Ø¤¹¤ë¤Û¤È¤ó¤É¤ÎÀ©¸Â¤Ï¤Ê¤¯¤Ê¤ê¡¢¼ÂºÝŪ¤Ë¤Ï C++ ¤Î¤¤¤«¤Ê¤ë´Ø¿ô¤Ç¤âǤ°Õ¤Î°ú¿ô¤ò«Çû¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¡£
´Ø¿ô¹çÀ®¤Ï°ÅÌÛŪ¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤ë¤Î¤Ç¸Ä¡¹¤Î´Ø¿ô¹çÀ®Áàºî¤ÏÉÔÍפǤ¢¤ë¡£
¦Ë¼°¤Ï´Ø¿ô·¿¸À¸ì¤Ë¤ª¤¤¤Æ¤Ï°ìÈÌŪ¤Ê¤â¤Î¤Ç¤¢¤ë¡£ ¤½¤Îʸˡ¤Ï¸À¸ì¤Ë¤è¤Ã¤ÆÍÍ¡¹¤Ç¤¢¤ë¡£(¦Ë·×»»¤Î·Á¼°¤Ë¤è¤Ã¤Æ¤â°Û¤Ê¤ë) ¤·¤«¤·¡¢¦Ë¼°¤Î´ðËÜŪ¤Ê·Á¤Ï¼¡¤Î¤è¤¦¤Ç¤¢¤ë¡£
lambda x1 ... xn.e¦Ë¼°¤Ï̵̾´Ø¿ô¤òÄêµÁ¤·¡¢¼¡¤Î¤è¤¦¤Ë¹½À®¤µ¤ì¤ë¡£
¤³¤Î´Ø¿ô¤Î²¾°ú¿ô : x1 ... xn
²¾°ú¿ô x1 ... xn ¤«¤é´Ø¿ô¤ÎÃͤò·×»»¤¹¤ë¼° e
lambda x y.x+y¦Ë´Ø¿ô¤òŬÍѤ¹¤ë¤È¤Ï¡¢·Á¼°Åª¤Ê°ú¿ô¤ò¼ÂºÝ¤Î°ú¿ô¤ÇÃÖ¤´¹¤¨¤ë¤³¤È¤Ç¤¢¤ë¡£
(lambda x y.x+y) 2 3 = 2 + 3 = 5
C++ ¤Ë¤ª¤±¤ë¦Ë¼°¤Ç¤Ï¡¢lambda x1 ... xn ¤È¤¤¤¦Éôʬ¤¬¤Ê¤¯¡¢ ·Á¼°Åª¤Ê°ú¿ô¤Ïͽ¤á·è¤á¤é¤ì¤¿Ì¾Á°¤ò»ý¤Ã¤Æ¤¤¤ë¡£ ¸½ºß¤Î¥é¥¤¥Ö¥é¥ê¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¡¢ ¥×¥ì¡¼¥¹¥Û¥ë¥À¤È¸Æ¤Ð¤ì¤ë¤³¤Î¤è¤¦¤Êͽ¤á·è¤á¤é¤ì¤¿·Á¼°Åª¤Ê°ú¿ô¤¬»°¤Ä¤¢¤ë¡£ _1 ¤È _2 ¤È _3. ¤Ç¤¢¤ë¡£ ¤½¤ì¤¾¤ì¦Ë¼°¤Ç´Ø¿ôÄêµÁ¤µ¤ì¤¿´Ø¿ô¤ÎÂè°ì¡¢ÂèÆó¡¢Âè»°°ú¿ô¤ò¼¨¤¹¡£ Î㤨¤Ð¡¢
lambda x y.x+y¤Î C++ ¤Ë¤ª¤±¤ëÄêµÁ¤Ï
_1 + _2¤È¤Ê¤ë¡£
¤è¤Ã¤Æ¡¢C++¤Î¦Ë¼°¤Ë¤ÏʸˡŪ¤Ê¥¡¼¥ï¡¼¥É¤Ï¸ºß¤·¤Ê¤¤¡£ ¥ª¥Ú¥é¥ó¥É¤È¤·¤Æ¥×¥ì¡¼¥¹¥Û¥ë¥À¡¼¤Î»È¤¹¤ë¤³¤È¤Ï¡¢¤³¤Î±é»»»Ò¤Î¸Æ½Ð¤·¤Ï¦Ë¼°¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤¹¤ë¡£ ¤·¤«¤·¡¢¤³¤ì¤Ï±é»»»Ò¤Î¸Æ½Ð¤·¤Ë´Ø¤·¤Æ¤Î¤ßÀµ¤·¤¤¡£ ´Ø¿ô¸Æ½Ð¤·¤ä¡¢Áàºî¹½Â¤¡¢¥¥ã¥¹¥È¤Ê¤É¤¬´Þ¤Þ¤ì¤¿¦Ë¼°¤Ï¡¢ÆÃÊ̤ÊʸˡŪ¹½Â¤¤¬É¬ÍפȤʤ롣 ¤µ¤é¤Ë½ÅÍפʤ³¤È¤Ë¤Ï¡¢´Ø¿ô¸Æ½Ð¤·¤ÏÆâÉô¤Ç¤Ï¡¢´Ø¿ô boost::lambda::bind ¤Ç¥é¥Ã¥×¤µ¤ì¤ëɬÍפ¬¤¢¤ë¡£ Î㤨¤Ð¡¢
lambda x y.foo(x,y)¤È¤¤¤¦¦Ë¼°¤ò¹Í¤¨¤Æ¤ß¤ë¡£ ¤³¤Î¼°¤ËÂбþ¤¹¤ë C++ ¤Î¼°¤Ï¡¢ foo(_1, _2) ¤Ç¤Ï¤Ê¤¯¡¢
bind(foo, _1, _2)¤È¤Ê¤ë¡£ ¤³¤Î¼ï¤Î¦Ë¼°¤òbind ¼°¤È¸Æ¤Ö¤³¤È¤Ë¤¹¤ë¡£
¦Ë¼°¤Ï C++ ¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤òÄêµÁ¤¹¤ë¡£¤è¤Ã¤Æ¡¢´Ø¿ôŬÍѤÎʸˡ¤Ï¾¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤Î¸Æ½Ð¤·¤ÈƱÍͤǤ¢¤ë¡£ ¤¹¤Ê¤ï¤Á¡¢(_1 + _2)(i, j) ¤è¤¦¤Ê·Á¤Ç¤¢¤ë¡£
´Ø¿ô boost::lambda::bind ¤Ï¼Â¼Á¾åÉôʬ´Ø¿ôŬÍѤǤ¢¤ë¡£ Éôʬ´Ø¿ôŬÍѤǤϡ¢´Ø¿ô¤Î°ú¿ô¤Î¤¤¤¯¤Ä¤«¤òÄê¿ô¤ØÂ«Çû¤¹¤ë¡£ ŬÍѤηë²Ì¤ÏÊ̤ʴؿô¤Ç¤¢¤ë¡£¤½¤·¤Æ¡¢¤½¤Î´Ø¿ô¤Î°ú¿ô¤Ï¤ª¤½¤é¤¯¸µ¤Î´Ø¿ô¤è¤ê¤â¾¯¤Ê¤¤¡£ «Çû¤µ¤ì¤Æ¤¤¤Ê¤¤°ú¿ô¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ½Ð¤µ¤ì¤¿¤È¤¡¢ ¤³¤Î¿·¤·¤¤´Ø¿ô¤Ï«Çû¤µ¤ì¤¿°ú¿ô¤È¤½¤¦¤Ç¤Ê¤¤°ú¿ô¤È¤ò¤Þ¤È¤á¤¿°ú¿ô¥ê¥¹¥È¤ò¤â¤Ã¤Æ¸µ¤Î´Ø¿ô¤ò¸Æ½Ð¤¹¡£