ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

¹ØÓÚC++ Traints¡ª¡ªÍøÒ×09Äê±ÊÊÔÌâ
2012-10-10 09:03:37 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1872´Î
Tags£º¹ØÓÚ Traints ÍøÒ× 09Äê ÊÔÌâ
Traits¼¼Êõ¿ÉÒÔÓÃÀ´»ñµÃÒ»¸ö ÀàÐÍ µÄÏà¹ØÐÅÏ¢µÄ¡£ Ê×ÏȼÙÈçÓÐÒÔÏÂÒ»¸ö·ºÐ͵ĵü´úÆ÷À࣬ÆäÖÐÀàÐͲÎÊý T Ϊµü´úÆ÷ËùÖ¸ÏòµÄÀàÐÍ£º

template <typename T>
class myIterator
{
...
};

µ±ÎÒÃÇʹÓÃmyIteratorʱ£¬ÔõÑù²ÅÄÜ»ñÖªËüËùÖ¸ÏòµÄÔªËصÄÀàÐÍÄØ£¿ÎÒÃÇ¿ÉÒÔΪÕâ¸öÀà¼ÓÈëÒ»¸öÄÚǶÀàÐÍ£¬ÏñÕâÑù£º
template <typename T>
class myIterator
{
      typedef T value_type; 
...
};
ÕâÑùµ±ÎÒÃÇʹÓÃmyIteratorÀàÐÍʱ£¬¿ÉÒÔͨ¹ý myIterator::value_typeÀ´»ñµÃÏàÓ¦µÄmyIteratorËùÖ¸ÏòµÄÀàÐÍ¡£

ÏÖÔÚÎÒÃÇÀ´Éè¼ÆÒ»¸öËã·¨£¬Ê¹ÓÃÕâ¸öÐÅÏ¢¡£
template <typename T>
typename myIterator<T>::value_type Foo(myIterator<T> i)
{
...
}
ÕâÀïÎÒÃǶ¨ÒåÁËÒ»¸öº¯ÊýFoo£¬ËüµÄ·µ»ØΪΪ ²ÎÊýi ËùÖ¸ÏòµÄÀàÐÍ£¬Ò²¾ÍÊÇT£¬ÄÇôÎÒÃÇΪʲô»¹ÒªÐËʦ¶¯ÖÚµÄʹÓÃÄǸövalue_typeÄØ£¿ ÄÇÊÇÒòΪ£¬µ±ÎÒÃÇÏ£ÍûÐÞ¸ÄFooº¯Êý£¬Ê¹ËüÄܹ»ÊÊÓ¦ËùÓÐÀàÐ͵ĵü´úÆ÷ʱ£¬ÎÒÃÇ¿ÉÒÔÕâÑùд£º
template <typename I> //ÕâÀïµÄI¿ÉÒÔÊÇÈÎÒâÀàÐ͵ĵü´úÆ÷
typename I::value_type Foo(I i)
{
...
}
ÏÖÔÚ£¬ÈÎÒⶨÒåÁË value_typeÄÚǶÀàÐ͵ĵü´úÆ÷¶¼¿ÉÒÔ×öΪFooµÄ²ÎÊýÁË£¬²¢ÇÒFooµÄ·µ»ØÖµµÄÀàÐͽ«ÓëÏàÓ¦µü´úÆ÷ËùÖ¸µÄÔªËصÄÀàÐÍÒ»Ö¡£ÖÁ´ËÒ»ÇÐÎÊÌâËƺõ¶¼Òѽâ¾ö£¬ÎÒÃDz¢Ã»ÓÐʹÓÃÈκÎÌØÊâµÄ¼¼Êõ¡£È»¶øµ±¿¼Âǵ½ÒÔÏÂÇé¿öʱ£¬ÐµÄÎÊÌâ±ãÏÔÏÖ³öÀ´ÁË£º

Ô­ÉúÖ¸ÕëÒ²ÍêÈ«¿ÉÒÔ×öΪµü´úÆ÷À´Ê¹Óã¬È»¶øÎÒÃÇÏÔȻûÓа취ΪԭÉúÖ¸ÕëÌí¼ÓÒ»¸övalue_typeµÄÄÚǶÀàÐÍ£¬Èç´ËÒ»À´ÎÒÃǵÄFoo()º¯Êý¾Í²»ÄÜÊÊÓÃÔ­ÉúÖ¸ÕëÁË£¬Õâ²»Äܲ»ËµÊÇÒ»´óȱº¶¡£ÄÇôÓÐʲô°ì·¨¿ÉÒÔ½â¾öÕâ¸öÎÊÌâÄØ£¿ ´Ëʱ±ãÊÇÎÒÃǵÄÖ÷½Ç£ºÀàÐÍÐÅϢեȡ»ú Traits µÇ³¡µÄʱºòÁË

....drum roll......

ÎÒÃÇ¿ÉÒÔ²»Ö±½ÓʹÓÃmyIteratorµÄvalue_type£¬¶øÊÇͨ¹ýÁíÒ»¸öÀàÀ´°ÑÕâ¸öÐÅÏ¢ÌáÈ¡³öÀ´£º
template <typename T>
class Traits
{
      typedef typename T::value_type value_type;
};
ÕâÑù£¬ÎÒÃÇ¿ÉÒÔͨ¹ý Traits<myIterator>::value_type À´»ñµÃmyIteratorµÄvalue_type£¬ÓÚÊÇÎÒÃÇ°ÑFooº¯Êý¸Äд³É£º
template <typename I> //ÕâÀïµÄI¿ÉÒÔÊÇÈÎÒâÀàÐ͵ĵü´úÆ÷
typename Traits<I>::value_type Foo(I i)
{
...
}
È»¶ø£¬¼´Ê¹ÕâÑù£¬ÄǸöÔ­ÉúÖ¸ÕëµÄÎÊÌâÈÔȻûÓнâ¾ö£¬ÒòΪTraitÀàÒ»Ñùû°ì·¨»ñµÃÔ­ÉúÖ¸ÕëµÄÏà¹ØÐÅÏ¢¡£ÓÚÊÇÎÒÃǼÀ³öC++(www.cppentry.com)µÄÓÖÒ»¼þÀûÆ÷--Æ«ÌØ»¯(partial specialization)£º
template <typename T>
class Traits<T*> //×¢Òâ ÕâÀïÕë¶ÔÔ­ÉúÖ¸Õë½øÐÐÁËÆ«ÌØ»¯
{
      typedef typename T value_type;
};
ͨ¹ýÉÏÃæÕâ¸ö TraitsµÄÆ«ÌØ»¯°æ±¾£¬ÎÒÃdzÂÊöÁËÕâÑùÒ»¸öÊÂʵ£ºÒ»¸ö T* ÀàÐ͵ÄÖ¸ÕëËùÖ¸ÏòµÄÔªËصÄÀàÐÍΪ T¡£

Èç´ËÒ»À´£¬ÎÒÃÇµÄ Fooº¯Êý¾ÍÍêÈ«¿ÉÒÔÊÊÓÃÓÚÔ­ÉúÖ¸ÕëÁË¡£±ÈÈ磺
int * p;
....
int i = Foo(p);
Traits»á×Ô¶¯ÍƵ¼³ö p ËùÖ¸ÔªËصÄÀàÐÍΪ int£¬´Ó¶øFooÕýÈ··µ»Ø¡£
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºC/C++ÃæÊÔÎÊÌâ·ÖÀà´ó»ã×Ü ÏÂһƪ£ºÍøÒ×C++±ÊÊÔÌâ

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿