欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

傳送門

模板對于類型的約束:

約束 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> 仍然可以嘗試編譯,從語法層面沒有問題,但會編譯失敗,原因:C/C++ 使用不完整的類型。

人們無法在編譯期間來增加更多檢查約束的有效性。

例一:

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ù)仍可以增加泛型約束,只是沒有辦法向模板類型一樣可以明確的約束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è)基類,那么這種似乎不需要模板來實(shí)現(xiàn),如果是模板大約是這樣的形式:

約束T必須是A類或其派生類型,但使用該模板函數(shù)的開放人員只有兩個(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ù)注釋上明確指出,這樣使用模板的開發(fā)人員不需要嘗試預(yù)編譯代碼或閱讀模板代碼實(shí)現(xiàn)來判定模板代碼約束條件。

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

相關(guān)文章

  • C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā)

    C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • c++并查集優(yōu)化(基于size和rank)

    c++并查集優(yōu)化(基于size和rank)

    這篇文章主要介紹了c++并查集優(yōu)化(基于size和rank),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言超細(xì)致講解分支語句

    C語言超細(xì)致講解分支語句

    分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句
    2022-05-05
  • 在vs2017上配置AppGameKit庫的圖文教程

    在vs2017上配置AppGameKit庫的圖文教程

    這篇文章主要介紹了在vs2017上配置AppGameKit庫的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • c++實(shí)現(xiàn)簡單的線程池

    c++實(shí)現(xiàn)簡單的線程池

    本文介紹的線程池采用C++語言,在windows平臺下實(shí)現(xiàn)。本著技術(shù)分享的精神寫作本文同時(shí)公布源代碼。歡迎大家指出該線程池存在的問題并對當(dāng)前性能進(jìn)行討論。
    2015-03-03
  • C++ 函數(shù)指針詳細(xì)總結(jié)

    C++ 函數(shù)指針詳細(xì)總結(jié)

    這篇文章主要介紹了C++ 函數(shù)指針內(nèi)容,下面文章圍繞C++ 函數(shù)指針的相關(guān)資料展開詳細(xì)內(nèi)容,包括函數(shù)指針的進(jìn)階內(nèi)容,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • 利用C語言實(shí)現(xiàn)五子棋游戲

    利用C語言實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 深入理解c/c++ 內(nèi)存對齊

    深入理解c/c++ 內(nèi)存對齊

    這篇文章主要介紹了c/c++ 內(nèi)存對齊,有需要的朋友可以參考一下
    2014-01-01
  • C語言實(shí)現(xiàn)高精度減法

    C語言實(shí)現(xiàn)高精度減法

    高精度的本質(zhì)是將數(shù)字以字符串的形式讀入,然后將每一位分別存放入int數(shù)組中,通過模擬每一位的運(yùn)算過程,來實(shí)現(xiàn)最終的運(yùn)算效果,下面我們就來看看C語言如何實(shí)現(xiàn)高精度減法吧
    2023-11-11
  • C++虛函數(shù)表和虛析構(gòu)介紹

    C++虛函數(shù)表和虛析構(gòu)介紹

    這篇文章主要介紹了C++虛函數(shù)表和虛析構(gòu),虛函數(shù)表是C++實(shí)現(xiàn)多態(tài)的基礎(chǔ),多態(tài)是面向?qū)ο蟮娜筇匦灾?,下面文章我們一起來看看詳?xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11

最新評論