青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

traits:Traits技術初探

概述:
traits
是一種特性萃取技術,它在Generic Programming中被廣泛運用,常常被用于使不同的類型可以用于相同的操作,或者針對不同類型提供不同的實現.traits在實現過程中往往需要用到以下三種C++的基本特性:
enum
typedef
template
(partial) specialization
其中:
enum
用于將在不同類型間變化的標示統一成一個,它在C++中常常被用于在類中替代define,你可以稱enum為類中的define;
typedef
則用于定義你的模板類支持特性的形式,你的模板類必須以某種形式支持某一特性,否則類型萃取器traits將無法正常工作.看到這里你可能會想,太苛刻了吧?其實不然,不支持某種特性本身也是一種支持的方式(見示例2,我們定義了兩種標示,__xtrue_type__xfalse_type,分別表示對某特性支持和不支持).
template
(partial) specialization被用于提供針對特定類型的正確的或更合適的版本.
借助以上幾種簡單技術,我們可以利用traits提取類中定義的特性,并根據不同的特性提供不同的實現.你可以將從特性的定義到萃取,再到traits的實際使用統稱為traits技術,但這種定義使得traits顯得過于復雜,我更愿意將traits的定義限于特性萃取,因為這種定義使得traits顯得更簡單,更易于理解,^_^.

舉例:
上面提到過,traits可被用于針對不同類型提供不同的實現,那么下面就舉兩個例子來說明如何實現這一點.
Example 1:
假定我們需要為某個類設計一個可以對所有類型(包括普通的int/long...,提供了clone方法的復雜類型CComplexObject,及由該類派生的類)進行操作的函數clone,下面,先用OO的方法來考慮一下解決方案.看到前面的條件,最先跳進你腦子里的肯定是Interface,pure virtual function等等.對于我們自己設計的類CComplexObject而言,這不是問題,但是,對于基本數據類型呢?還有那些沒有提供clone方法的復雜類型呢?(這時候你可能會想,要是Java該多easy,所有類都默認從Object派生,Object已提供了一個默認的clone方法,但是,要使類真正支持clone,還必須implements Cloneable,所以,同樣也不能避免這里遇到的麻煩).
下面是一個可能的解決方案:
template
<typename T, bool isClonable>
class
XContainer
{
     ...

     void
clone(T* pObj)
     {

         if
(isClonable)
         {

             pObj->clone();
         }

         else

         {

             //... non-Clonable algorithm ...
         }
     }
};

但是只要你測試一下,這段代碼不能通過編譯.為什么會這樣呢?原因很簡單:對于沒有實現clone方法的非Clonable類或基本類型,pObj->clone這一句是非法的.
那么怎樣解決上面的這個難題呢?上面不能通過編譯的代碼告訴我們,要使我們的代碼通過編譯,就不能使非Clonable類或基本類型的代碼中出現pObj->clone,即我們需要針對不同類型提供不同的實現.為了實現這一點,我們可以在我們的模板類中用enum定義一個trait,以標示類是否為Clonable,然后在原模板類內部引入一個traits提取類Traits,通過對該類進行specilizing,以根據不同的trait提供不同的實現.具體實現如下:
#include <iostream>
using namespace std;

class
CComplexObject // a demo class
{
public
:
     void
clone() { cout << "in clone" << endl; }
};


// Solving the problem of choosing method to call by inner traits class
template <typename T, bool isClonable>
class
XContainer
{

public
:
     enum
{Clonable = isClonable};

     void
clone(T* pObj)
     {

         Traits<isClonable>().clone(pObj);
     }


     template
<bool flag>
         class
Traits
     {
     };


     template
<>
         class
Traits<true>
     {

     public
:
         void
clone(T* pObj)
         {

             cout << "before cloning Clonable type" << endl;
             pObj->clone();
             cout << "after cloning Clonable type" << endl;
         }
     };


     template
<>
         class
Traits<false>
     {

     public
:
         void
clone(T* pObj)
         {

             cout << "cloning non Clonable type" << endl;
         }
     };
};


void
main()
{

     int
* p1 = 0;
     CComplexObject* p2 = 0;

     XContainer<int, false> n1;
     XContainer<CComplexObject, true> n2;

     n1.clone(p1);
     n2.clone(p2);
}

編譯運行一下,上面的程序輸出如下的結果:
doing something non Clonable
before doing something Clonable
in clone
after doing something Clonable
這說明,我們成功地根據傳入的isClonable模板參數為模板實例選擇了不同的操作,在保證接口相同的情況下,為不同類型提供了不同的實現.

Example 2:
我們再對上面的例子進行一些限制,假設我們的clone操作只涉及基本類型和CComplexObject及其派生類,那么我們可以進一步給出下面的解法:
#include <iostream>
using namespace std;

struct
__xtrue_type { }; // define two mark-type
struct __xfalse_type { };

class
CComplexObject // a demo class
{
public
:
     virtual
void clone() { cout << "in clone" << endl; }
};


class
CDerivedComplexObject : public CComplexObject // a demo derived class
{
public
:
     virtual
void clone() { cout << "in derived clone" << endl; }
};


// A general edtion of Traits
template <typename T>
struct
Traits
{

     typedef
__xfalse_type has_clone_method; // trait 1: has clone method or not? All types defaultly has no clone method.
};

// Specialized edtion for ComplexObject
template <>
struct
Traits<CComplexObject>
{

     typedef
__xtrue_type has_clone_method;
};


template
<typename T>
class
XContainer
{

     template
<typename flag>
         class
Impl
     {
     };

     template
<>
         class
Impl <__xtrue_type>
     {

     public
:
         void
clone(T* pObj)
         {

             pObj->clone();
         }
     };

     template
<>
         class
Impl <__xfalse_type>
     {

     public
:
         void
clone(T* pObj)
         {
         }
     };

public
:
     void
clone(T* pObj)
     {

         Impl<Traits<T>::has_clone_method>().clone(pObj);
     }
};


void
main()
{

     int
* p1 = 0;
     CComplexObject c2;
     CComplexObject* p2 = &c2;
     CDerivedComplexObject c3;
     CComplexObject* p3 = &c3; // you must point to a derived object by a base-class pointer,
                             //it's a little problem

     XContainer<int> n1;
     XContainer<CComplexObject> n2;
     XContainer<CComplexObject> n3;

     n1.clone(p1);
     n2.clone(p2);
     n3.clone(p3);
}

現在,所有基本類型以及CComplexObject類系都可以用于XContainer.

結語:
看到這里,你或許會說,traits不過如此,還以為是什么高深的玩意呢!其實技術就是這樣,說白了都很Easy,關鍵是怎么將他們用于實際,為實際的Designing/Development服務.畢竟,IT領域,不能應用于實際的技術是沒有價值的.

posted on 2008-11-09 01:19 肥仔 閱讀(7956) 評論(1)  編輯 收藏 引用 所屬分類: C++ 模板

評論

# re: traits:Traits技術初探  回復  更多評論   

示例不能運行啊
2016-04-26 11:31 | lzq
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产亚洲另类动漫| 在线日韩中文字幕| 久久久精品一区二区三区| 亚洲欧美日韩精品久久| 亚洲欧美伊人| 久久精品女人的天堂av| 久久精品日产第一区二区| 久久精品视频网| 免费黄网站欧美| 欧美日韩亚洲系列| 国产欧美大片| 亚洲电影免费观看高清完整版在线观看 | 亚洲女同在线| 欧美一区激情视频在线观看| 久久婷婷麻豆| 亚洲国产精品v| 蜜桃av一区| 日韩视频不卡| 久久久久久久尹人综合网亚洲| 久热精品视频在线观看一区| 欧美区在线观看| 国产一区视频网站| aa级大片欧美| 欧美一区激情视频在线观看| 久久夜精品va视频免费观看| 亚洲精品欧美激情| 性欧美大战久久久久久久久| 欧美高清影院| 国产一区二区三区久久悠悠色av | 亚洲电影免费在线| av不卡在线| 久久久久一区| 99亚洲伊人久久精品影院红桃| 欧美在线视频一区二区| 久久综合色天天久久综合图片| 欧美久久久久免费| 狠狠色综合网| 在线免费观看日韩欧美| 欧美国产日本韩| 国产欧美一区二区三区在线老狼| 亚洲激情在线播放| 亚洲专区在线| 亚洲韩国日本中文字幕| 欧美一区成人| 欧美午夜电影在线| 亚洲高清三级视频| 欧美在线不卡| 日韩系列在线| 欧美国产极速在线| 亚洲国产视频一区二区| 久久综合亚洲社区| 欧美一区高清| 国产一区二区中文字幕免费看| 亚洲女爱视频在线| 一本到高清视频免费精品| 欧美精品一区二区高清在线观看| 伊人一区二区三区久久精品| 欧美在线电影| 欧美亚洲专区| 国产色产综合色产在线视频| 午夜精品久久久久久| 亚洲精品一区二区三区av| 老鸭窝亚洲一区二区三区| 狠狠色综合网站久久久久久久| 久久国产精品亚洲77777| 亚洲欧美国产精品专区久久| 国产精品一区三区| 欧美伊久线香蕉线新在线| 亚洲免费视频中文字幕| 国产欧美日韩视频一区二区| 午夜精品视频在线观看| 亚洲影院在线| 国内精品久久久久影院色| 乱码第一页成人| 免费观看成人网| 亚洲麻豆国产自偷在线| 亚洲美洲欧洲综合国产一区| 嫩模写真一区二区三区三州| 99精品视频免费| 亚洲特黄一级片| 国产精品欧美在线| 久久久中精品2020中文| 狂野欧美激情性xxxx欧美| 91久久精品日日躁夜夜躁国产| 亚洲人成免费| 国产精品夜夜嗨| 欧美91福利在线观看| 欧美日韩在线不卡一区| 久久久精品一区| 欧美精品日韩| 久久精品一本久久99精品| 欧美18av| 性色av一区二区三区在线观看| 欧美在线一二三四区| 日韩午夜在线视频| 亚洲一区二区视频| 亚洲激情午夜| 亚洲综合国产| 91久久久在线| 久久午夜视频| 欧美日韩国产专区| 欧美日韩欧美一区二区| 美女主播一区| 一区二区成人精品| 欧美亚洲尤物久久| 欧美乱妇高清无乱码| 亚洲一区二区三区视频| 亚洲女同同性videoxma| 伊人男人综合视频网| 亚洲天天影视| 亚洲毛片在线观看.| 亚洲欧美综合v| 亚洲日本在线视频观看| 性欧美大战久久久久久久久| 在线成人黄色| 欧美在线视频a| 亚洲欧美在线一区二区| 麻豆精品精华液| 久久久欧美精品| 国产精品爽爽爽| 亚洲网在线观看| 亚洲一区免费视频| 欧美日本一区| 91久久精品国产91久久| 国产伦精品免费视频| 一本大道久久a久久精品综合| 亚洲精品欧美专区| 欧美福利视频在线| 欧美成人视屏| 在线欧美日韩| 老司机成人在线视频| 欧美aa在线视频| 亚洲国产精品一区二区www在线| 久久国产精品亚洲va麻豆| 久久精品国产免费观看| 国产午夜精品久久久久久免费视| 亚洲天堂成人在线视频| 午夜久久电影网| 国产午夜精品一区二区三区欧美| 西瓜成人精品人成网站| 久久久亚洲高清| 亚洲国产激情| 欧美经典一区二区三区| 亚洲九九精品| 亚洲欧美精品伊人久久| 国产欧美丝祙| 久久久亚洲人| 亚洲高清视频的网址| 一区二区三区高清视频在线观看| 欧美日韩另类字幕中文| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美激情第二页| 亚洲另类视频| 欧美午夜精品一区二区三区| 亚洲一区二区三区国产| 久久久久久综合| 亚洲精品国产精品国自产观看| 在线日本高清免费不卡| 亚洲欧美日韩电影| 狂野欧美激情性xxxx欧美| 亚洲人成网站色ww在线| 欧美日韩精品一二三区| 夜夜嗨av色综合久久久综合网| 亚洲欧美伊人| 亚洲第一页中文字幕| 欧美精品成人在线| 新狼窝色av性久久久久久| 欧美夫妇交换俱乐部在线观看| 一区二区三区四区五区视频| 国产视频欧美| 欧美精品久久久久久久| 午夜视频在线观看一区| 亚洲高清不卡在线| 欧美中文在线观看| 最新亚洲激情| 国产日韩欧美高清| 欧美精品色网| 久久超碰97中文字幕| 亚洲精品视频在线| 久久婷婷国产综合国色天香| 99re热这里只有精品视频| 国产丝袜一区二区| 欧美理论大片| 久久九九久久九九| 一区二区三区 在线观看视| 免费在线看成人av| 欧美制服丝袜| 中文av字幕一区| 永久免费精品影视网站| 欧美视频在线观看免费| 噜噜爱69成人精品| 欧美在线看片| 亚洲欧美日本精品| 一本色道久久| 亚洲精品乱码久久久久久| 免费久久99精品国产自在现线| 性欧美xxxx大乳国产app| 日韩午夜中文字幕| 亚洲国产精品999| 韩国精品一区二区三区|