最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++泛型模板約束深入講解

 更新時(shí)間:2022年09月21日 08:31:58   作者:liulilittle  
C/C++ 作為 C# 語(yǔ)言的前置版本,ECMA工業(yè)化編程語(yǔ)言,自然是存在 “泛型模板約束” 的功能的,只是本文不以 C/C++ 20 新語(yǔ)法搞出來(lái)的 “requires” 關(guān)鍵字來(lái)實(shí)現(xiàn),它很難用

CPP參考:(新標(biāo)準(zhǔn))

傳送門

模板對(duì)于類型的約束:

約束 template_get_size 泛型T只允許接受類型:list<T>,其實(shí)為 C/C++ 泛型模板例化特性,但與泛型模板例化略微有些區(qū)別,因?yàn)槭菐Х盒皖愋图s束條件的特例化。

template<typename T>
class list {
public:
    int count = 0;
};
template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<list<T> > {
    inline std::size_t size(list<T>& v) {
        return v.count;
    }
};
int main(int argc, const char* argv[]) noexcept {
    list<int> list_;
    list_.count = 100;
    template_get_size<list<int> > list_get_size_;
    printf("%d\n", list_get_size_.size(list_));
    return 0;
}

但,template_get_size<int> 仍然可以嘗試編譯,從語(yǔ)法層面沒(méi)有問(wèn)題,但會(huì)編譯失敗,原因:C/C++ 使用不完整的類型。

人們無(wú)法在編譯期間來(lái)增加更多檢查約束的有效性。

例一:

template<typename T>
struct template_get_size {
    static_assert(false, "Type constraints of generic templates are violated.");
};

例二:

template<typename T>
struct template_get_size;
template<typename T>
struct template_get_size<T> {
    static_assert(false, "Type constraints of generic templates are violated.");
};

上述適用于泛型模板類/結(jié)構(gòu)體,同理泛型模板函數(shù)仍可以增加泛型約束,只是沒(méi)有辦法向模板類型一樣可以明確的約束T到底需要是什么類型,這取決于模板函數(shù)內(nèi)部的實(shí)現(xiàn),根代碼粘合劑差不多,但不意味著不能精確限制那些T類型。

泛型模板類型例化:

class A {};
class B : public A {};
template<typename T>
class say;
template<>
class say<A> {};

例如:人們需要T是一個(gè)指針,那么有以下幾種方法約束:

案例一:

template<typename T>
void foo(const T* v) {}

案例二:

template<typename T>
void foo(const T& v) {
    typedef typename std::remove_pointer<T>::type element_type;
    element_type* p = NULL;
}

如果:

人們需要T是一個(gè)基類,那么這種似乎不需要模板來(lái)實(shí)現(xiàn),如果是模板大約是這樣的形式:

約束T必須是A類或其派生類型,但使用該模板函數(shù)的開(kāi)放人員只有兩個(gè)途徑搞清楚T到底被約束為什么。

即:1、函數(shù)注釋上明確T的約束類型,2、查看模板函數(shù)的內(nèi)部實(shí)現(xiàn),不像C#中明確為泛型模板類型 T 增加顯示一致性的 where T 約束條件。

class A {};
class B : public A {};
template<typename T>
void foo(const T* v) {
    A* a = const_cast<T*>(v);
}
int main(int argc, const char* argv[]) noexcept {
    B b;
    foo(&b);
    return 0;
}

一個(gè)好的建議是:

每個(gè)泛型模板的類型約束都應(yīng)在類型/函數(shù)注釋上明確指出,這樣使用模板的開(kāi)發(fā)人員不需要嘗試預(yù)編譯代碼或閱讀模板代碼實(shí)現(xiàn)來(lái)判定模板代碼約束條件。

到此這篇關(guān)于C++泛型模板約束深入講解的文章就介紹到這了,更多相關(guān)C++泛型模板約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中多才多藝的 const

    C++中多才多藝的 const

    在C++中,關(guān)鍵字const可以用來(lái)修飾任何作用域內(nèi)的變量、函數(shù)參數(shù)、函數(shù)本體、函數(shù)返回值、成員函數(shù)、迭代器,也可以用來(lái)修飾指針本身和指針目標(biāo),可謂多才多藝,我們要詳細(xì)了解其內(nèi)部細(xì)節(jié),以及邏輯奧秘,讓這把多功能瑞士軍刀盡情發(fā)揮其作用,需要的朋友可以參考一下
    2021-09-09
  • C++基于特征向量的KNN分類算法

    C++基于特征向量的KNN分類算法

    這篇文章主要為大家詳細(xì)介紹了C++基于特征向量的KNN分類算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++11互斥量的具體使用

    C++11互斥量的具體使用

    互斥量是一種同步原語(yǔ),是一種線程同步的手段,用來(lái)保護(hù)多線程同時(shí)訪問(wèn)的共享數(shù)據(jù),本文主要介紹了C++11互斥量的具體使用,感興趣的可以了解一下
    2023-11-11
  • 如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)

    如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)

    最大公約數(shù)是指兩個(gè)或多個(gè)整數(shù)共有約數(shù)中,最大的一個(gè)約數(shù),常用的方法是歐幾里得算法,也叫輾轉(zhuǎn)相除法,下面這篇文章主要給大家介紹了關(guān)于如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C++基于reactor的服務(wù)器百萬(wàn)并發(fā)實(shí)現(xiàn)與講解

    C++基于reactor的服務(wù)器百萬(wàn)并發(fā)實(shí)現(xiàn)與講解

    這篇文章主要介紹了C++基于reactor的服務(wù)器百萬(wàn)并發(fā)實(shí)現(xiàn)與講解,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源碼

    C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言線性表全面梳理操作方法

    C語(yǔ)言線性表全面梳理操作方法

    線性表,數(shù)據(jù)結(jié)構(gòu)中最簡(jiǎn)單的一種存儲(chǔ)結(jié)構(gòu),專門用于存儲(chǔ)邏輯關(guān)系為"一對(duì)一"的數(shù)據(jù)。線性表是基于數(shù)據(jù)在實(shí)際物理空間中的存儲(chǔ)狀態(tài),又可細(xì)分為順序表(順序存儲(chǔ)結(jié)構(gòu))和鏈表
    2022-04-04
  • 基于Matlab實(shí)現(xiàn)山脊圖的繪制

    基于Matlab實(shí)現(xiàn)山脊圖的繪制

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)山脊圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-05-05
  • C++的繼承法則詳解

    C++的繼承法則詳解

    本文詳細(xì)介紹了C++中的繼承機(jī)制,包括繼承的概念、定義、使用方法、訪問(wèn)限定符、賦值兼容轉(zhuǎn)換、作用域、默認(rèn)成員函數(shù)、友元關(guān)系、靜態(tài)成員以及單繼承、多繼承和菱形繼承,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

乌兰浩特市| 牙克石市| 和龙市| 巴彦县| 左权县| 临安市| 拜泉县| 武安市| 南部县| 乡城县| 胶南市| 微山县| 财经| 泽普县| 崇阳县| 恭城| 荔浦县| 江山市| 峨山| 色达县| 保德县| 彭州市| 东明县| 香格里拉县| 垦利县| 临夏县| 高碑店市| 古蔺县| 义乌市| 光山县| 成都市| 海宁市| 雷波县| 尼玛县| 东乡| 抚松县| 治多县| 耒阳市| 仁寿县| 新巴尔虎右旗| 侯马市|