精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产三级小视频| 99久久精品久久亚洲精品| 欧美电影网站| 国产精品丝袜91| 99久久精品免费看国产四区| 日韩精品在线不卡| 欧美日韩国产高清电影| 91精品国产欧美一区二区成人| 波多野结衣与黑人| 日本五码在线| 九九**精品视频免费播放| 欧美国产亚洲视频| 91l九色lporny| 亚洲视频精选| 欧美日韩亚洲另类| 日韩免费视频播放| 日本中文字幕视频在线| 91在线精品一区二区| 成人激情综合网| 欧产日产国产69| 亚洲午夜久久久久久尤物| 国产一区二区三区高清在线观看| 97免费公开视频| 最新日韩一区| 欧美日韩裸体免费视频| 先锋影音欧美| 国产一区精品| av一区二区久久| caoporn国产精品免费公开| 亚洲一级片免费看| 久久精品1区| 97视频色精品| 欧美成人aaa片一区国产精品| 蜜桃一区二区三区| 亚洲成人精品视频| 亚洲丝袜在线观看| 高清一区二区中文字幕| 欧美吞精做爰啪啪高潮| 成人黄色片视频| 182在线视频观看| 一区二区三区不卡视频| 欧美三级午夜理伦三级老人| av影片在线看| 国产日韩综合av| 欧美日韩在线一区二区三区| 婷婷综合激情网| 大白屁股一区二区视频| 国产精品播放| 亚洲国产精品suv| 国产精品自拍三区| 5g影院天天爽成人免费下载| 88av在线视频| 久久99精品国产麻豆不卡| 国产精品看片资源| 中文永久免费观看| 青青草成人在线观看| 国产精品免费小视频| 国产天堂第一区| 蜜臀久久99精品久久久久久9| 国产97在线播放| av手机天堂网| 久久精品久久99精品久久| 国产在线精品一区免费香蕉| 91国内精品视频| 国产一区二区美女诱惑| 超碰在线97av| 天天在线女人的天堂视频| 成熟亚洲日本毛茸茸凸凹| 国产伦视频一区二区三区| 人妻精品一区二区三区| 99re66热这里只有精品3直播 | **日韩最新| 91精品国产综合久久精品麻豆| 亚洲一级片免费观看| 一区二区三区免费在线看| 亚洲激情免费观看| 亚洲精品一区二区三区影院忠贞| 日韩欧美高清在线播放| 操日韩av在线电影| 日产精品久久久久| 石原莉奈一区二区三区在线观看| 国产精品综合网站| 国产不卡av在线播放| www.欧美.com| 亚洲欧洲在线一区| 成人av影院在线观看| 日本韩国欧美国产| 超碰91在线播放| 中文有码一区| 欧美刺激性大交免费视频| 国产成人在线视频观看| 激情五月婷婷综合网| 国产精品视频在线免费观看| 高清性色生活片在线观看| 亚洲美女免费视频| 欧美日韩中文在线视频| www.久久热| 日韩大陆毛片av| 顶级黑人搡bbw搡bbbb搡| 在线观看日韩av电影| 国产精品久久久久久久久影视| 国产麻豆91视频| 91在线观看高清| 中文字幕av导航| 在线观看欧美日韩电影| 91精品国产福利| xxx在线播放| 欧美日本亚洲韩国国产| 国产91色在线免费| 好吊视频一二三区| 综合中文字幕亚洲| 成人性做爰aaa片免费看不忠| 视频一区日韩精品| 一区二区欧美日韩视频| 日韩三级免费看| 国产麻豆91精品| 视频一区二区三| 日本不卡1234视频| 日韩免费看网站| 蜜桃av.com| 爽好多水快深点欧美视频| 国产在线精品一区二区三区| av电影高清在线观看| 一本一道久久a久久精品| 久久久久国产免费| 亚洲精品一区二区在线看| 国产精品激情av在线播放| 人成网站在线观看| 一二三四区精品视频| 三级一区二区三区| 日韩电影免费网站| 国产精品亚发布| 韩国免费在线视频| 色婷婷狠狠综合| 特级西西人体wwwww| 亚洲精品影院在线观看| 成人精品水蜜桃| 国精一区二区三区| 欧美成人精品1314www| 国产日韩欧美在线观看视频| 精品亚洲国产成人av制服丝袜 | 成人免费激情视频| jizz视频在线观看| 在线观看亚洲精品| 免费视频91蜜桃| 日本不卡一区二区三区| 日本一区二区在线视频观看| 在线日韩影院| 亚洲欧美日韩久久久久久| 好吊妞视频一区二区三区| 暴力调教一区二区三区| 六月丁香激情网| 思热99re视热频这里只精品| 91精品国产自产91精品| 日韩有码电影| 日本高清无吗v一区| 精品无人区无码乱码毛片国产| 日日摸夜夜添夜夜添精品视频| 日本在线高清视频一区| 福利一区二区| 久久精品久久久久久国产 免费| 国产又粗又黄又爽的视频| 亚洲视频香蕉人妖| 99精品视频国产| 精品1区2区3区4区| 麻豆久久久9性大片| 搜成人激情视频| 视频在线观看99| 精品久久久久中文慕人妻| 亚洲国产一二三| a级一a一级在线观看| 久久精品动漫| 在线播放 亚洲| 欧美美女在线直播| 国产精品黄视频| www视频在线看| 亚洲精品国产美女| 中文字幕a级片| 亚洲黄色av一区| 人妻无码一区二区三区| 蜜臀av性久久久久蜜臀av麻豆 | 宅男在线观看免费高清网站| 精品国精品自拍自在线| 午夜精品久久久久久久蜜桃| 国产精品国产三级国产有无不卡 | 久久综合狠狠综合久久激情| 手机看片一级片| 欧美视频日韩| 日韩精品久久久免费观看 | 日韩三级免费观看| 亚洲 欧美 日韩 综合| 国产精品每日更新| jjzzjjzz欧美69巨大| 日韩av在线播放中文字幕| 国内精品国产三级国产99| 免费一区二区三区视频导航| 成人免费看片视频| 成人午夜视屏| 欧美精品午夜视频| 成人免费在线观看| 精品国产百合女同互慰| 中文字幕第一页在线播放| 亚洲第一在线综合网站| 国产一二三四视频| xnxx国产精品| 午夜诱惑痒痒网| 日韩黄色免费网站| 无码专区aaaaaa免费视频| 国产精品久久久久久久免费观看 | 黄网在线免费| 亚洲国产精品电影在线观看| 91亚洲精品国偷拍自产在线观看 | 中文字幕中文乱码欧美一区二区| 国产麻豆剧传媒精品国产av| 国产一区免费电影| 少妇黄色一级片| 在线亚洲免费| 成人免费a级片| 999久久久精品国产| 日本一区二区三区视频免费看 | 日韩尤物视频| 日韩有码av| 国产精品成人观看视频免费| 粉嫩一区二区三区在线观看| 国产欧美日韩最新| 69堂精品视频在线播放| 97成人在线视频| 波多野结衣在线高清| 粗暴蹂躏中文一区二区三区| 日韩美女网站| 色yeye香蕉凹凸一区二区av| 男人天堂网在线| 日韩av影视综合网| 人妻无码一区二区三区久久99| 91精品福利在线一区二区三区| 亚洲综合免费视频| 欧美日韩亚洲综合在线 | 热久久免费视频| 日韩欧美xxxx| 天堂va蜜桃一区二区三区| 亚洲欧洲日产国码无码久久99| 99riav1国产精品视频| 又大又硬又爽免费视频| 国产精品s色| 欧美黄网在线观看| 在线观看的日韩av| 美女日批免费视频| 国产精品婷婷| 成人羞羞国产免费网站| 久久综合九色| 国产精品入口免费软件| 麻豆91精品视频| www.五月天色| 国产精品自产自拍| www.啪啪.com| 9l国产精品久久久久麻豆| av网站免费在线播放| 337p粉嫩大胆色噜噜噜噜亚洲| 日韩人妻无码精品综合区| 中文字幕欧美激情| 天天天天天天天天操| 亚洲激情网站免费观看| 精品无码人妻一区二区三| 亚洲国产毛片aaaaa无费看| 日韩精品久久久久久久| 色域天天综合网| 中文字幕欧美在线观看| 91精品国产综合久久久蜜臀图片| www三级免费| 亚洲黄页视频免费观看| 精品av中文字幕在线毛片| 中文字幕在线看视频国产欧美| 黄色精品免费看| 久久久久久国产三级电影| 一个人www视频在线免费观看| 国产精品久久中文| 一区二区三区欧洲区| 久久99精品久久久久久三级| 欧美亚洲国产一区| 色撸撸在线观看| 在线不卡欧美| 激情黄色小视频| av在线不卡网| 成人信息集中地| 亚洲综合色网站| 97人妻一区二区精品视频| 欧美精品日韩综合在线| 老牛影视av牛牛影视av| 一区二区中文字幕| sm性调教片在线观看| 热re91久久精品国99热蜜臀| 日本午夜精品久久久久| 好吊妞www.84com只有这里才有精品 | 欧美va在线播放| 户外极限露出调教在线视频| 欧美激情第三页| 97精品国产综合久久久动漫日韩| 99久久免费国| 日韩理论电影| 能在线观看的av| 国产黑丝在线一区二区三区| 国产jjizz一区二区三区视频| 一二三区精品福利视频| 中文字幕网址在线| 日韩精品在线视频观看| av黄在线观看| 国产日韩欧美日韩| 亚洲影院天堂中文av色| 国产成人一二三区| 久久机这里只有精品| av在线网站观看| 亚洲线精品一区二区三区| 国产精品久久久久久久久久久久久久久久 | 久久国产免费| 97精品人妻一区二区三区蜜桃| 国产精品二三区| www.欧美色| 精品无码久久久久久国产| a级大胆欧美人体大胆666| 91免费的视频在线播放| 成人在线国产| 不卡影院一区二区| 99久久精品免费看| 免看一级a毛片一片成人不卡| 91麻豆精品国产91久久久久久久久 | 欧美高清第一页| 91成人短视频在线观看| 五月天久久综合网| 日韩高清一区二区| 强伦人妻一区二区三区| 欧美性猛交xxxx久久久| 天堂网在线资源| 国内精品久久久久伊人av| 69精品国产久热在线观看| 福利网在线观看| 极品少妇xxxx精品少妇偷拍| 刘亦菲国产毛片bd| 欧美日韩免费在线视频| yourporn在线观看中文站| 日本精品久久电影| 男男gay无套免费视频欧美| 色欲av无码一区二区人妻| 99re这里都是精品| 午夜精品久久久久久久久久久久久蜜桃| 欧美成人伊人久久综合网| 中文字幕中文字幕在线中高清免费版| 成人激情春色网| 91精品久久久久久久蜜月 | 99国产精品视频免费观看| 日韩xxx高潮hd| 亚洲国产日韩欧美在线99| free性欧美| 久久婷婷开心| 欧美专区在线| 东方伊人免费在线观看| 欧美人与z0zoxxxx视频| 中文字幕有码在线观看| 国产98在线|日韩| 中文久久精品| av永久免费观看| 538prom精品视频线放| 三级资源在线| 久久久婷婷一区二区三区不卡| 丝袜美腿亚洲一区二区图片| 中国1级黄色片| 日韩欧美国产小视频| 国产伦久视频在线观看| 日本不卡久久| 国内欧美视频一区二区| 美女毛片在线观看| 亚洲欧美成人网| 日韩av黄色| 欧美人成在线观看| 久久精品一区二区三区不卡牛牛| 成人黄色免费网| 欧美激情精品久久久久久免费印度| 久久国产精品色av免费看| 黄色国产小视频| 一区二区三区欧美| 日中文字幕在线| 96pao国产成视频永久免费| 亚洲美女黄网| 永久免费观看片现看| 欧美成人精品二区三区99精品| 厕沟全景美女厕沟精品| 国产91av视频在线观看| 白白色亚洲国产精品| 一本色道久久综合无码人妻| 欧美激情一区二区三区成人| 国产探花一区在线观看| 亚洲综合中文网| 在线观看视频一区| 秋霞在线午夜| 亚洲国产精品一区二区第一页| 成人综合在线视频| 中文字幕日韩三级| 97在线观看免费| 亚洲澳门在线| 谁有免费的黄色网址| 亚洲国产成人一区|