±¾ÎĵÄÄ¿±êÊÇ£¬ÈÃÒÔÏ´úÂëÄÜ˳ÀûÅÜÆðÀ´£º
int intfun0()
{
return 1;
}
struct _intfunctor0
{
int operator()()
{
return 2;
}
} intfunctor0;
struct Test
{
int intmem0()
{
return 3;
}
} test;
int main()
{
Function
Function
Function
Function
f1();
f1_();
f2();
f3();
return 0;
}
³ýÁËÉÏÊöÀý×ÓÖÐÏÔʾµÄ£¬»¹ÒªÖ§³ÖÓзµ»ØÖµµÄº¯ÊýºÍû·µ»ØÖµµÄº¯Êý£¬ÒÔ¼°ÓÐ0¸ö¡¢1¸ö¡¢2¸ö¡¢¡¡¡¢MAX ¸ö²ÎÊýµÄº¯Êý£¬²ÎÊýÀàÐÍÎÞÏÞÖÆ¡£×îºóʵÏÖµÄ Function ¶ÔÏó½ö½ö¿ÉÒÔÖ´Ðоͺᣣ¨ÖÁÓÚÊÇ·ñ¿É¿½±´¡¢ÊÇ·ñ¿ÉÅжÏÏàµÈ µÈÎÊÌ⣬¶¼ÊÇСÊ£¬±¾ÎÄÔݲ»¿¼ÂÇ¡££©×îºó£¬Bind ¸ÅÄîÒ²²»ÔÚ±¾ÎÄÌÖÂÛ·¶Î§Ö®ÄÚ¡£
¶ÔÓÚÕâ¸öÎÊÌ⣬ÎÒÃÇÒ»¿ªÊ¼¿¼ÂǵĿÉÄÜÊÇÔõÑùͳһÈýÖÖ²»Í¬ÐÎʽ¡£ÓÐÁ½¸öÑ¡Ôñ£¬µÚÒ»£¬Ê¹Óà C++ µÄ¶à̬»úÖÆ£¬×îºóͳһµ½»ùÀàÖ¸ÕëµÄÀàÐÍ£»µÚ¶þ£¬ÔÊÐíÀàÄÚ²¿ÓÐÈßÓà±äÁ¿ÒÔ¼°±ØÒªµÄ Flag£¬ÓÃÓÚÅжÏÊÇÄÄÖÖÐÎʽµÄº¯Êý£¬ÒªÈçºÎÖ´ÐС£ÕâÑù¿´ÆðÀ´£¬µÚÒ»ÖÖ·½°¸±ÈµÚ¶þÖÖˬһµã¡£ÓÚÊÇ£¬×î³õÏëµ½µÄʵÏÖÓпÉÄÜÊÇÕâÑùµÄ£º
Ïȶ¨ÒåÒ»¸öÐé»ùÀࣺ
template
class FunctionBase0
{
public:
virtual R Invoke() = 0;
virtual ~FunctionBase0() {}
};
È»ºóʵÏÖÒ»¸öÆÕͨº¯Êý/·Âº¯ÊýµÄ°æ±¾£º
template
class Function0 : public FunctionBase0
{
public:
R Invoke()
{
return m_Fun();
}
public:
Function0(const T &fun)
: m_Fun(fun)
{
}
private:
T m_Fun;
};
ÕâÀïÐèҪ˵Ã÷µÄÊÇ£¬Èç¹ûÊÇÆÕͨº¯Êý£¬T»á±»ÌØ»¯³É R() »òÕß R (&)() »òÕß R(*)()£¬È¡¾öÓÚʹÓõÄʱºò´«Èë fun »¹ÊÇ´«Èë &fun¡£ËùÒÔ²»±ØÁíÍâʵÏÖÕë¶Ô R(*)() µÄ°æ±¾¡£Loki £¨¹ÃÇÒ¾ÍÒÔ×÷Æ·Ãû³Æºõ Loki µÄ×÷Õß°É£¬ËûÄǸöÕæÃûʵÔÚÊÇÌ«³¤£©ÔÚËûµÄÊéÖгÆÖ®Îª¡°×öÒ»¸ö£¬ËÍÒ»¸ö¡±¡£²»¹ý¶ÔÓÚËûÊéÖÐËù˵µÄ£¬ÎÒÓÐÒ»¸öÒÉ»ó¡£Loki ˵´«Èë fun£¬Ä£°æ²ÎÊý T »á±»ÌØ»¯³É R (&)()£¬ÓÚÊÇÒ»ÇÐ˳Àû¡£¿ÉÊÇÎÒÔÚ²Ù×÷¹ý³ÌÖз¢ÏÖ T Ò»Ö±±»ÌØ»¯³É R ()£¬ÓÚÊÇÉÏÊö class ÖÐµÄ m_Fun ±»ÈÏΪÊdzÉÔ±º¯Êý¶ø²»ÊdzÉÔ±±äÁ¿¡£²»ÖªµÀÊÇΪʲô£¬ÓÐÖªµÀÕßÇë²»ÁßÖ¸½Ì¹þ¡£ÒòΪÒÔÉÏÔÒò£¬±¾ÎÄÖÐÎÒÒ»Ö±Óà &fun µÄÐÎʽ¶Ô´ýÆÕͨº¯Êý¡£
ÔÙʵÏÖÒ»¸ö³ÉÔ±º¯ÊýµÄ°æ±¾£º
template
class MemberFunction0 : public FunctionBase0
{
public:
R Invoke()
{
return (m_pObj->*m_pMemFun)();
}
public:
MemberFunction0(T *pObj, R (T::*pMemFun)())
: m_pObj(pObj), m_pMemFun(pMemFun)
{
}
private:
R (T::*m_pMemFun)();
T *m_pObj;
};
×îºóÊÇÒ»¸ö°ü×°Àà¡£Èç¹ûÄã¿ÉÒÔ½ÓÊÜ Function
ΪÁË´ïµ½Õâ¸öÄ¿±ê£¬ÎÒÃÇÒªÍæÒ»Ð©Æ«ÌØ»¯¼¼ÇÉ¡£¹ØÓÚÆ«ÌØ»¯£¬ÎÒÒ»Ö±ÒÔÀ´µÄ·ôdzÈÏʶ¶¼ÊÇ´íÎóµÄ¡£ÎÒÔÒÔΪ£¬¶ÔÓÚÄ£°æÀࣺ
template
class Foo;
ÎÒÈç¹ûÌØ»¯ÆäÖÐÒ»¸ö²ÎÊý T1£º
template
class Foo
{
}
ÎÒÒÔΪֻÓÐÕâÑù²Å½ÐÆ«ÌØ»¯£¬ÒÔÎªÆ«ÌØ»¯µÄ¹ý³Ì×ÜÊǼõÉÙÄ£°æ²ÎÊýµÄ¡£¶øÊµ¼ÊÉÏ£¬Ö»ÒªÓÃij¸ö/ЩÀàÐÍÕ¼¾ÝÔʼģ°æ²ÎÊýµÄλÖ㬾ͿÉÒÔÁË¡£±ÈÈ磬¶ÔÓÚÉÏÊö Foo£¬ÎÒ¿ÉÒÔÌØ»¯Ò»¸ö class
template
class Foo
{
}
ÔÀ´ T1 µÄλÖñ» std::map
template
class Foo
{
}
ÒÔ¼°
template
class Foo
{
}
ÆäÖкóÕßÊÇʵÏÖÀàÐÍÝÍÈ¡µÄÖ÷Òª·½Ê½¡£Ö»ÒªÌØ»¯ÒÔºó£¬Õâ¸öÀàÒÀÈ»´øÓÐÖÁÉÙÒ»¸öÄ£°æ²ÎÊý£¬¾ÍÊÇÆ«ÌØ»¯¡£Èç¹û×îºó²úÉúÁË template<> µÄÐÎʽ£¬ÄǾÍÊÇÍêÈ«ÌØ»¯¡£
»Øµ½ÎÒÃǸղŵÄÖ÷Ì⣬ÎÒÃÇÒªÌṩ¸øÓû§µÄÊÇÕâÑùÒ»¸öÀࣺ
template
class Function;
ÆäÖвÎÊý Signature »á±»Êµ¼ÊµÄº¯ÊýÀàÐÍËùÌØ»¯¡£µ«ÊÇÎÒÃÇÖ»ÖªµÀÕûÌåµÄÒ»¸ö Signature ²¢Ã»ÓÐÓã¬ÎÒÃDZØÐëÖªµÀ±»·Ö½â¿ªÀ´µÄ·µ»ØÖµÀàÐÍ¡¢²ÎÊýÀàÐÍ¡£ÓÚÊÇ£¬ÒýÈëÒ»¸öÆ«ÌØ»¯°æ±¾£º
template
class Function
ÕâÀïʹÓà R () ÌØ»¯ÔʼµÄ Signature£¬ÒýÈëÒ»¸öеIJÎÊý R¡£ÓÚÊÇ·µ»ØÖµÀàÐÍ R ¾Í±»ÝÍÈ¡³öÀ´ÁË¡£ÊµÏÖÈçÏ£º
template
class Function
{
public:
template
Function(const T &fun)
: m_pFunBase(new Function0
{
}
template
Function(T *pObj, R (T::*pMemFun)())
: m_pFunBase(new MemberFunction0
{
}
~Function()
{
delete m_pFunBase;
}
R operator ()()
{
return m_pFunBase->Invoke();
}
private:
FunctionBase0
};
Èç¹û¶ÔÉÏÃæËµµÄ¡°ÆÕͨº¯ÊýµÄʹÓ÷½Ê½±ØÐëÊǺ¯ÊýÖ¸Õë¶ø²»ÊǺ¯Êý±¾Éí¡±¹¢¹¢ÓÚ»³£¬¿ÉÒÔÔÙÒýÈëÒ»¸öµÄ¹¹Ô캯Êý£º
typedef R (F