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ÕýÈ··µ»Ø¡£