精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

玩轉C++方法模板,編程技能秒提升

開發 前端
C++ 允許對類的單個方法進行模板化。這種方法被稱為方法模板,可以存在于普通類或類模板中。

方法模板

C++ 中的方法模板

C++ 允許對類的單個方法進行模板化。這種方法被稱為方法模板,可以存在于普通類或類模板中。編寫方法模板實際上就是為許多不同類型編寫該方法的不同版本。方法模板對于類模板中的賦值運算符和拷貝構造函數非常有用。

警告:虛方法和析構函數不能是方法模板。

考慮僅有一個模板參數的原始 Grid 模板:元素類型。您可以實例化許多不同類型的網格,例如 int 和 double:

Grid<int> myIntGrid;
Grid<double> myDoubleGrid;

然而,Grid<int> 和 Grid<double> 是兩種不同的類型。如果你編寫一個接受 Grid<double> 類型對象的函數,你不能傳遞 Grid<int>。即使你知道 int 網格的元素可以復制到 double 網格的元素中,因為 int 可以轉換為 double,但你不能將 Grid<int> 類型的對象賦值給 Grid<double> 類型的對象,或從 Grid<int> 構造 Grid<double>。以下兩行都無法編譯:

myDoubleGrid = myIntGrid; // 無法編譯
Grid<double> newDoubleGrid { myIntGrid }; // 無法編譯

問題在于 Grid 模板的拷貝構造函數和賦值運算符定義如下:

Grid(const Grid& src);
Grid& operator=(const Grid& rhs);

等效于:

Grid(const Grid<T>& src);
Grid<T>& operator=(const Grid<T>& rhs);

Grid 的拷貝構造函數和 operator= 都需要一個 const Grid<T>& 的引用。當你實例化 Grid<double> 并嘗試調用拷貝構造函數和 operator= 時,編譯器生成以下原型的方法:

Grid(const Grid<double>& src);
Grid<double>& operator=(const Grid<double>& rhs);

注意,生成的 Grid<double> 類中沒有接受 Grid<int> 的構造函數或 operator=。

幸運的是,您可以通過向 Grid 類添加模板化的拷貝構造函數和賦值運算符的版本來糾正這種疏忽,從而生成將一個網格類型轉換為另一個網格類型的方法。以下是新的 Grid 類模板定義:

export template <typename T>
class Grid {
public:
    template <typename E>
    Grid(const Grid<E>& src);

    template <typename E>
    Grid& operator=(const Grid<E>& rhs);

    void swap(Grid& other) noexcept;
    // 為了簡潔省略部分內容
};

原始的拷貝構造函數和拷貝賦值運算符不能被移除。如果 E 等于 T,編譯器不會調用這些新的模板化拷貝構造函數和模板化拷貝賦值運算符。首先查看新的模板化拷貝構造函數:

template <typename E>
Grid(const Grid<E>& src);

您可以看到有另一個模板聲明,使用不同的類型名 E(代表“元素”)。類在一個類型 T 上進行模板化,新的拷貝構造函數也在不同的類型 E 上進行模板化。這種雙重模板化允許您將一個類型的網格復制到另一個類型。以下是新拷貝構造函數的定義:

template <typename T>
template <typename E>
Grid<T>::Grid(const Grid<E>& src)
    : Grid { src.getWidth(), src.getHeight() } {
    // 此構造函數的 ctor-initializer 首先委托給非拷貝構造函數來分配適當的內存量。
    // 下一步是復制數據。
    for (size_t i { 0 }; i < m_width; i++) {
        for (size_t j { 0 }; j < m_height; j++) {
            m_cells[i][j] = src.at(i, j);
        }
    }
}

如您所見,您必須在成員模板行(帶 E 參數)之前聲明類模板行(帶 T 參數)。您不能像這樣組合它們:

template <typename T, typename E> // 對于嵌套模板構造函數錯誤!
Grid<T>::Grid(const Grid<E>& src)

除了構造函數定義之前的額外模板參數行外,注意您必須使用公共訪問方法 getWidth()、getHeight() 和 at() 來訪問 src 的元素。那是因為您正在復制到的對象是 Grid<T> 類型的,而您正在復制的對象是 Grid<E> 類型的。它們不是同一類型,所以您必須使用公共方法。

swap() 方法實現如下:

template <typename T>
void Grid<T>::swap(Grid& other) noexcept {
    std::swap(m_width, other.m_width);
    std::swap(m_height, other.m_height);
    std::swap(m_cells, other.m_cells);
}

模板化賦值運算符接受一個 const Grid<E>&,但返回一個 Grid<T>&:

template <typename T>
template <typename E>
Grid<T>& Grid<T>::operator=(const Grid<E>& rhs) {
    // 使用復制-交換習慣用法
    Grid<T> temp { rhs }; // 在臨時實例中完成所有工作。
    swap(temp); // 僅通過非拋出操作提交工作。
    return *this;
}

這個賦值運算符的實現使用了復制-交換習慣用法。swap() 方法只能交換同一類型的 Grids,但這沒關系,因為這個模板化賦值運算符首先使用模板化拷貝構造函數將給定的 Grid<E> 轉換為 Grid<T>,名為 temp。之后,它使用 swap() 方法將這個臨時的 Grid<T> 與 this(也是 Grid<T> 類型)交換。

使用非類型參數的方法模板

不同大小網格的賦值和拷貝

在先前的例子中,使用整數模板參數 HEIGHT 和 WIDTH,主要問題是高度和寬度成為了類型的一部分。這種限制阻止了將一個尺寸的網格賦值給另一個不同尺寸的網格。然而,在某些情況下,將一個大小的網格賦值或拷貝給不同大小的網格是可取的。與其使目標對象成為源對象的完美克隆,不如只從源數組中復制適合目標數組的元素,并在源數組較小的維度上用默認值填充目標數組。使用賦值運算符和拷貝構造函數的方法模板,您可以做到這一點,從而允許賦值和拷貝不同大小的網格。以下是類定義:

export template <typename T, size_t WIDTH = 10, size_t HEIGHT = 10>
class Grid {
public:
    Grid() = default;
    virtual ~Grid() = default;
    // 明確默認拷貝構造函數和賦值運算符。
    Grid(const Grid& src) = default;
    Grid& operator=(const Grid& rhs) = default;

    template <typename E, size_t WIDTH2, size_t HEIGHT2>
    Grid(const Grid<E, WIDTH2, HEIGHT2>& src);

    template <typename E, size_t WIDTH2, size_t HEIGHT2>
    Grid& operator=(const Grid<E, WIDTH2, HEIGHT2>& rhs);

    void swap(Grid& other) noexcept;

    std::optional<T>& at(size_t x, size_t y);
    const std::optional<T>& at(size_t x, size_t y) const;

    size_t getHeight() const { return HEIGHT; }
    size_t getWidth() const { return WIDTH; }

private:
    void verifyCoordinate(size_t x, size_t y) const;
    std::optional<T> m_cells[WIDTH][HEIGHT];
};

這個新定義包括拷貝構造函數和賦值運算符的方法模板,以及一個輔助方法 swap()。注意,非模板化的拷貝構造函數和賦值運算符是明確默認的(因為用戶聲明了析構函數)。它們僅復制或賦值源對象的 m_cells 到目標對象,這正是對于相同大小的兩個網格所希望的語義。

下面是模板化拷貝構造函數的實現:

template <typename T, size_t WIDTH, size_t HEIGHT>
template <typename E, size_t WIDTH2, size_t HEIGHT2>
Grid<T, WIDTH, HEIGHT>::Grid(const Grid<E, WIDTH2, HEIGHT2>& src) {
    for (size_t i { 0 }; i < WIDTH; i++) {
        for (size_t j { 0 }; j < HEIGHT; j++) {
            if (i < WIDTH2 && j < HEIGHT2) {
                m_cells[i][j] = src.at(i, j);
            } else {
                m_cells[i][j].reset();
            }
        }
    }
}

請注意,此拷貝構造函數僅從 src 中復制 x 和 y 維度上的 WIDTH 和 HEIGHT 元素,即使 src 比這更大。如果 src 在任一維度上較小,則額外位置的 std::optional 對象使用 reset() 方法重置。

下面是 swap() 方法和賦值運算符 operator= 的實現:

template <typename T, size_t WIDTH, size_t HEIGHT>
void Grid<T, WIDTH, HEIGHT>::swap(Grid& other) noexcept {
    std::swap(m_cells, other.m_cells);
}

template <typename T, size_t WIDTH, size_t HEIGHT>
template <typename E, size_t WIDTH2, size_t HEIGHT2>
Grid<T,

 WIDTH, HEIGHT>& Grid<T, WIDTH, HEIGHT>::operator=(
    const Grid<E, WIDTH2, HEIGHT2>& rhs) {
    // 使用復制-交換習慣用法
    Grid<T, WIDTH, HEIGHT> temp { rhs }; // 在臨時實例中完成所有工作。
    swap(temp); // 僅通過非拋出操作提交工作。
    return *this;
}

這個賦值運算符的實現使用了復制-交換習慣用法。swap() 方法只能交換相同類型的 Grids,但這是可以的,因為這個模板化賦值運算符首先使用模板化拷貝構造函數將給定的 Grid<E, WIDTH2, HEIGHT2> 轉換為 Grid<T, WIDTH, HEIGHT>,稱為 temp。之后,它使用 swap() 方法交換這個臨時 Grid<T, WIDTH, HEIGHT> 和 this。

責任編輯:趙寧寧 來源: coding日記
相關推薦

2010-01-22 14:46:25

C++語言

2010-02-02 09:49:02

C++模板

2023-09-25 13:28:14

C++Lambda

2010-01-13 18:34:43

C++ 托管

2022-01-17 10:12:47

C++‘模板元編程

2023-12-18 11:15:03

2024-06-20 13:22:13

C++11C++模板

2011-05-30 15:29:32

C++

2011-07-10 15:26:54

C++

2023-12-13 10:51:49

C++函數模板編程

2010-01-26 17:11:13

C++編程

2020-12-28 08:46:38

編程開發技能

2020-10-29 12:55:47

編程代碼開發

2020-04-06 12:20:51

Vim文本編輯器Linux

2010-01-26 13:55:07

C++標準模板庫

2010-01-19 18:18:21

C++語言

2010-01-21 09:46:24

C++程序

2010-01-15 10:14:21

C++ Builder

2023-12-06 13:48:00

C++代碼

2010-02-03 17:42:33

C++模板參數
點贊
收藏

51CTO技術棧公眾號

九九九九九伊人| 亚洲一区二区三区午夜| 久久精品视频5| av亚洲免费| 日韩视频免费直播| 国产v片免费观看| 91社区在线| 国产aⅴ综合色| 欧美孕妇与黑人孕交| 啪啪一区二区三区| 久久a级毛片毛片免费观看| 欧美伊人久久久久久久久影院| 黄色高清视频网站| 婷婷国产在线| 国产不卡在线一区| 国产99在线|中文| 久久久久99精品成人片毛片| 国产九一精品| 亚洲成人aaa| 天天影视色综合| 美女搞黄视频在线观看| 亚洲同性同志一二三专区| 国产精品99久久久久久久| 天天天天天天天干| 激情综合视频| 美日韩精品免费观看视频| 全黄一级裸体片| 都市激情亚洲| 日韩欧美国产综合一区 | 久草福利资源在线| 日韩有码中文字幕在线| 日韩女优电影在线观看| 五月婷婷六月丁香激情| 日韩av福利| 精品国产成人在线| 成人精品视频在线播放| 国产在线高清视频| 国产精品毛片大码女人| 欧洲一区二区在线 | www国产成人免费观看视频 深夜成人网| 国产日韩欧美一二三区| 久久久久久久久久一级| 中日韩视频在线观看| 色综合色综合久久综合频道88| 欧美日韩国产一二三区| 国内精品久久久久久久影视简单| 亚洲精品一区av在线播放| 中文字幕99页| 1769国产精品视频| 日韩午夜电影av| 先锋资源在线视频| 秋霞一区二区| 日韩三级视频在线看| 伊人成人免费视频| 不卡精品视频| 日韩精品一区二区三区在线观看 | 一区二区免费| 欧美成人猛片aaaaaaa| 国产成人强伦免费视频网站| 激情不卡一区二区三区视频在线| 在线不卡中文字幕播放| 午夜剧场在线免费观看| 2019中文亚洲字幕| 欧美一级在线观看| 性生交大片免费看l| 999在线精品| 亚洲福利视频免费观看| 久久久老熟女一区二区三区91| 大奶一区二区三区| 亚洲精品美女久久| 久久精品国产亚洲AV熟女| 国产一区二区三区91| 伊人伊人伊人久久| 三级在线观看免费大全| 欧美日韩免费| 欧美夫妻性生活xx| 草久久免费视频| 性欧美长视频| 国产精品一区电影| 国产av精国产传媒| 成人美女视频在线观看18| 国产原创精品| 国产一区二区三区福利| 中文字幕一区二区三| 加勒比海盗1在线观看免费国语版| 怡红院av在线| 日韩欧美在线观看视频| 午夜激情av在线| 中文无码日韩欧| 日韩精品视频免费| 性生交大片免费全黄| 激情综合激情| 国产精品日韩av| 超碰免费在线97| 久久嫩草精品久久久久| 欧美少妇一级片| 欧美男人天堂| 欧美久久一二区| av无码一区二区三区| 国产一区日韩| 欧美日韩国产成人| 久久精品国产亚洲av麻豆蜜芽| 国产一区二区在线观看免费| 精品一区在线播放| 成人直播在线| 日本高清免费不卡视频| 中文字幕无人区二| 欧洲毛片在线视频免费观看| 久久久久久久久综合| 日本熟妇一区二区三区| 成人激情免费网站| 亚洲欧美日韩精品久久久| heyzo高清国产精品| 欧美日本韩国一区二区三区视频| 制服丝袜在线第一页| 欧美独立站高清久久| 亚州国产精品久久久| 一级黄色录像大片| 久久影院电视剧免费观看| 黄色特一级视频| 日本亚洲欧洲无免费码在线| 亚洲欧美三级伦理| 日韩精品一区二区三| 国产传媒久久文化传媒| 一区二区三区四区五区视频| 国产三级电影在线播放| 欧美成人乱码一区二区三区| 三上悠亚作品在线观看| 日韩成人伦理电影在线观看| 999视频在线观看| 亚洲1卡2卡3卡4卡乱码精品| 日韩欧美在线字幕| 亚洲视频在线播放免费| 欧美日韩一区二区国产| 成人精品视频久久久久| av在线天堂播放| 色拍拍在线精品视频8848| 欧类av怡春院| 99国产精品自拍| 成人影片在线播放| av免费在线观看网站| 欧美日韩国产另类一区| 精品手机在线视频| 日本不卡高清视频| 日韩欧美亚洲区| 亚洲一区二区三区四区| 亚洲人成电影网站色| 国产精品一区二区三区四| 成人av午夜影院| 免费一级特黄毛片| 色老板在线视频一区二区| 午夜精品美女自拍福到在线| 欧美特黄一级视频| 亚洲成人av在线电影| 亚洲少妇一区二区三区| 伊人久久综合| 国产视色精品亚洲一区二区| 97久久人人超碰caoprom| 亚洲电影免费观看高清| 国产稀缺真实呦乱在线| 91丨九色porny丨蝌蚪| 欧美变态另类刺激| 女人丝袜激情亚洲| 国产成人精品电影久久久| 岛国在线视频免费看| 欧美日韩一区二区三区视频| 91制片厂在线| 国产suv精品一区二区6| 国精产品一区一区三区视频| 亚洲精品一级二级三级| 国产精品精品视频| 欧美jizzhd欧美| 欧美大黄免费观看| 国产精品第九页| 久久人人97超碰com| 妓院一钑片免看黄大片| 久久免费精品视频在这里| 91精品免费视频| 女同视频在线观看| 亚洲毛片一区二区| 在线免费观看日韩视频| 一区二区在线电影| 在线观看国产网站| 蜜臀av性久久久久蜜臀aⅴ流畅 | wwwwww日本| 免费成人美女在线观看.| 中文字幕第一页亚洲| 亚洲高清999| 日韩免费在线视频| a级毛片免费观看在线| 亚洲第一偷拍网| 中文字幕人妻丝袜乱一区三区| 亚洲日本在线看| www.日本高清| 久久se精品一区二区| 国产精品一色哟哟| 欧美色蜜桃97| 国产精品一区二区av| 国产成人精品一区二区三区视频| 美日韩精品免费观看视频| 欧洲综合视频| 日韩欧美一级片| 日韩精品成人免费观看视频| 亚洲久草在线视频| jizz中文字幕| heyzo一本久久综合| 亚洲黄色av片| 久久国产一二区| 大陆av在线播放| 日韩在线二区| 蜜桃视频在线观看成人| 在线免费成人| 日韩美女av在线免费观看| av片在线观看网站| 国产亚洲精品久久| 欧美一区二区黄片| 91 com成人网| 青娱乐在线免费视频| 粉嫩老牛aⅴ一区二区三区| 国产97免费视频| 国产精品网站一区| 女人被狂躁c到高潮| 国产精品88av| 三级一区二区三区| 日欧美一区二区| 欧美 日韩 国产 高清| 欧美另类视频| 成人在线免费高清视频| 91亚洲人成网污www| 日韩高清专区| 色88888久久久久久影院| 高清一区二区三区视频| 最新亚洲国产| 成人精品在线观看| 欧美日韩卡一| 国产欧美一区二区白浆黑人| 外国电影一区二区| 国产高清在线不卡| 欧美18av| 国产成人一区二区三区| 韩日成人影院| 奇门遁甲1982国语版免费观看高清 | 成人污版视频| 国产在线拍揄自揄视频不卡99| 忘忧草在线www成人影院| 日韩av高清不卡| 欧美极度另类| 国产精品久在线观看| 欧洲av一区二区| 国产成一区二区| 欧美日韩激情电影| 国产精品久久久久7777婷婷| 欧美国产日韩电影| 国产精品免费观看在线| 日本午夜精品久久久久| 91免费观看网站| 精品国产三区在线| av一区和二区| 粉嫩精品导航导航| 久久99九九| 国产一区日韩| 在线免费观看成人网| 中文字幕日韩欧美精品高清在线| 国产一二三四五| 激情婷婷欧美| 日本xxxxxxx免费视频| 日韩1区2区日韩1区2区| 九九热精品在线播放| 国产美女一区二区| 高清中文字幕mv的电影| 97久久精品人人爽人人爽蜜臀| 风间由美一二三区av片| 国产网站一区二区| 男人晚上看的视频| 亚洲综合在线五月| 丰满人妻老熟妇伦人精品| 欧美午夜影院一区| 国产哺乳奶水91在线播放| 亚洲福利精品在线| 91资源在线播放| 久久91成人| 久久天堂国产精品| 99re66热这里只有精品8| 欧美 日韩 国产精品| 亚洲影院一区| 色姑娘综合天天| 99国产精品国产精品久久| 欧美一区二区三区粗大| 亚洲女子a中天字幕| 男人天堂2024| 91麻豆精品国产91久久久久| 欧美一级特黄aaaaaa大片在线观看| 亚洲精品自产拍| 精品国产99久久久久久| 88xx成人精品| 国产成人免费视频网站视频社区| 久久久99爱| 99精品美女| www.中文字幕在线| 精品一区二区三区久久| 添女人荫蒂视频| 亚洲天堂网中文字| 无码人妻精品一区二区三区蜜桃91 | 噜噜噜天天躁狠狠躁夜夜精品| 日韩在线电影一区| 91久久综合| 日本精品一区在线| 国产亚洲1区2区3区| 国产亚洲精久久久久久无码77777| 日本乱人伦一区| 色婷婷激情五月| 久久精品成人欧美大片| 在线成人av观看| 国产精品v欧美精品v日韩| 久久精品欧美一区| 大香煮伊手机一区| 波多野结衣91| 91在线播放观看| 欧美色成人综合| 四虎成人免费在线| 欧美精品久久久久久久免费观看| 123成人网| 日本一区二区三区在线视频| 亚洲精品免费观看| 午夜诱惑痒痒网| 亚洲国产成人在线| 无码人妻丰满熟妇区bbbbxxxx | 韩国av中国字幕| 亚洲欧洲另类国产综合| 国产精品成人无码| 国产视频综合在线| 17videosex性欧美| 春色成人在线视频| 中文字幕乱码亚洲无线精品一区 | 99视频一区二区三区| 欧美日韩大片在线观看| 欧美一区二区在线播放| 1pondo在线播放免费| 国产精品ⅴa在线观看h| 亚洲人成精品久久久| 91九色在线观看视频| 成人福利视频网站| 国产一级片久久| 亚洲第一中文字幕| av影院在线免费观看| 国产美女精品在线观看| 欧美日韩三级| 99免费观看视频| 亚洲国产精品一区二区尤物区| 亚洲精品911| 欧美丰满少妇xxxx| 国产成人一二| 尤物av无码色av无码| 26uuu成人网一区二区三区| 五月天婷婷久久| 亚洲视频在线观看视频| 日韩漫画puputoon| 亚洲区一区二区三区| 精品无人区卡一卡二卡三乱码免费卡| 91免费在线看片| 欧美一级一区二区| 成人性生交大片免费看在线播放| 国产精华一区二区三区| 宅男噜噜噜66一区二区| wwwwxxxx国产| 欧美网站一区二区| 黄视频网站在线看| 成人激情av| 国产精品丝袜xxxxxxx| 日本人亚洲人jjzzjjz| 5月丁香婷婷综合| 欧美1—12sexvideos| 久久一区二区三区欧美亚洲| 久久夜色精品| 欧美一级特黄高清视频| 欧美mv日韩mv国产网站app| 97超碰免费在线| 日韩在线国产| 国产一区二区看久久| 精品美女久久久久| 尤物精品国产第一福利三区| 日韩激情综合| 成年人免费在线播放| 亚洲国产高清aⅴ视频| 午夜精品久久久久久久96蜜桃| 欧美在线中文字幕| 国产精品久久久久蜜臀| 第四色在线视频| 欧美日韩在线一区二区| 日本高清在线观看视频| 欧美亚洲免费高清在线观看| 久久66热偷产精品| 精品成人久久久| 俺也去精品视频在线观看| 久久a爱视频| 青青草原国产在线视频| 精品免费在线观看| 免费黄网站在线| 欧美视频观看一区| 国产成人无遮挡在线视频|