Boolan C++ 第十周 三種巧妙的模板技術(shù)

模板作為C++語言特性的一個重要組成部分甸鸟,被廣泛用在范式編程中,在標(biāo)準(zhǔn)庫中經(jīng)扯妮海可以看到一些非常讓人拍案叫絕的模板技術(shù)。在課程中接觸到這些技術(shù)松嘶,做個整理和總結(jié)艘狭。

一. variadic templates

實現(xiàn)這一特性的方法是通過遞歸算法,一次處理一個目標(biāo)參數(shù)翠订,直到處理到最后的模板參數(shù)作為遞歸基返回巢音。
以標(biāo)準(zhǔn)庫的hash函數(shù)為例

template<typename... Types>
size_t hash_all(const Types&... args)
{
    size_t seed=0;
    hash_val(seed,args...); //進(jìn)入計算
    return seed;
}

template<typename T,typename... Types>
void hash_val(size_t &seed,
            const T& val,const Types&... args)
{
    //處理第一個模板參數(shù)
    hash_combine(seed,val);
    //遞歸
    hash_val(sed,args...);
}

//處理到最后一個參數(shù)
template<typename T>
void hash_val(size_t &seed,const T& val)
{
    hash_combine(seed,val);
}
//對模板參數(shù)進(jìn)行處理
#include <functional>
template<typename T>
void hash_combine(size_t &seed,const T  &val)
{
    seed^=std::hash<T>()(val)+0x9e3779b9
    +(seed<<6)+(seed>>2);
}

二. tuple的參數(shù)處理

template<typename... Values> class tuple;
//繼承鏈的最頂端
template<> class tuple<>{};
template<typename Head,typename... Tail>
class tuple<Head,Tail...>
    :private tuple<Tail...>
    {
        typedef tuple<Tail...> inherited;
    public:
        tuple(){}
        tuple(Head v,Tail... vtail)
        :m_head(v),inherited(vtail...){}
        typename Head::type head() {    return m_head;  }
        inherited &tail()   {   return *this;   }
    protected:
        Head m_head;
    };

tuple的設(shè)計是利用繼承鏈的最低端,在構(gòu)造函數(shù)中對它的直接基類進(jìn)行初始化尽超,而它的基類又對基類的直接基類進(jìn)行初始化官撼,不斷遞歸,直到直接基類是個空類為止似谁。

//以tuple(1,2.3,"hello")為例
tuple<int,float,string> t(1,2.3,"hello");
t.head() ; //1
t.tail();  //(2.3,"hello")
t.tail().head(); //2.3

三. type traits的設(shè)計

標(biāo)準(zhǔn)庫為我們提供了很多的type traits的模板類型歧寺,我們可以用來初始化獲得類型的相關(guān)信息燥狰。
以 is_void為例,用來判斷是不是void類型斜筐,解決思路是把對象的一些其他類型去除再來判斷是否為void

//去除 const 的屬性
template<typename T>
struct remove_const
{
    typedef T type;
};
template<typename T>
struct remove_const<T const>
{
    typedef T type;
};
//去除 volatile 的屬性
template<typename T>
struct remove_volatile
{
    typedef T type;
};
template<typename T>
struct remove_volatile<T volatile>
{
    typedef T type;
};
//去除 const volatile 的屬性
template<typename T>
struct remove_cv
{
    typedef typename remove_const<typename remove_volatile<T>::type>::type type;
};

template<typename>
struct __is_void_helper
:public false_type{};
template<>
struct __is_void_helper<void>
:public true_type{};
template<typename T>
//最后繼承 false_type 或 true_type
struct is_void
:public __is_void_helper<typename remove_cv<T>::type>::type{};

運用到模板的特化解決問題龙致,很多思路都是可以借鑒的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顷链,隨后出現(xiàn)的幾起案子目代,更是在濱河造成了極大的恐慌,老刑警劉巖嗤练,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榛了,死亡現(xiàn)場離奇詭異,居然都是意外死亡煞抬,警方通過查閱死者的電腦和手機霜大,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來革答,“玉大人战坤,你說我怎么就攤上這事〔泄眨” “怎么了途茫?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溪食。 經(jīng)常有香客問我囊卜,道長,這世上最難降的妖魔是什么错沃? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任栅组,我火速辦了婚禮,結(jié)果婚禮上枢析,老公的妹妹穿的比我還像新娘笑窜。我一直安慰自己,他們只是感情好登疗,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布排截。 她就那樣靜靜地躺著,像睡著了一般辐益。 火紅的嫁衣襯著肌膚如雪断傲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天智政,我揣著相機與錄音认罩,去河邊找鬼。 笑死续捂,一個胖子當(dāng)著我的面吹牛垦垂,可吹牛的內(nèi)容都是我干的宦搬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼劫拗,長吁一口氣:“原來是場噩夢啊……” “哼间校!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起页慷,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤憔足,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酒繁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滓彰,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年州袒,在試婚紗的時候發(fā)現(xiàn)自己被綠了揭绑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡郎哭,死狀恐怖他匪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彰居,我是刑警寧澤诚纸,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布撰筷,位于F島的核電站陈惰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毕籽。R本人自食惡果不足惜抬闯,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望关筒。 院中可真熱鬧溶握,春花似錦、人聲如沸蒸播。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袍榆。三九已至胀屿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間包雀,已是汗流浹背宿崭。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留才写,地道東北人葡兑。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓奖蔓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讹堤。 傳聞我的和親對象是個殘疾皇子吆鹤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容