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

掌握C++模板的藝術:類型參數、默認值和自動推導

開發 前端
在 Grid 示例中,Grid 模板有一個模板參數:存儲在網格中的類型。編寫類模板時,您需要在尖括號內指定參數列表。

一、模板參數

1.類型模板參數

在 Grid 示例中,Grid 模板有一個模板參數:存儲在網格中的類型。編寫類模板時,您需要在尖括號內指定參數列表,例如:

template <typename T>

這個參數列表類似于函數或方法中的參數列表。與函數和方法一樣,你可以編寫具有任意多個模板參數的類。此外,這些參數不必是類型,它們可以有默認值。

2.非類型模板參數

非類型參數是普通參數,如整數和指針——這類參數你可能已經在函數和方法中很熟悉了。然而,非類型模板參數只能是整型(char、int、long 等)、枚舉類型、指針、引用、std::nullptr_t、auto、auto& 和 auto*。C++20 還允許浮點類型和類類型的非類型模板參數。后者有很多限制,在本文中不再詳細討論。

在 Grid 類模板中,你可以使用非類型模板參數來指定網格的高度和寬度,而不是在構造函數中指定。在模板列表中指定非類型參數而不是在構造函數中指定的主要優點是這些值在代碼編譯之前就已知。回想一下,編譯器通過在編譯之前替換模板參數來生成模板實例的代碼。因此,你可以在實現中使用普通的二維數組,而不是動態調整大小的向量數組。以下是帶有更改的新類定義:

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

    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];
};

注意,模板參數列表需要三個參數:存儲在網格中的對象類型,以及網格的寬度和高度。寬度和高度用于創建存儲對象的二維數組。下面是類方法的定義:

// 類方法定義
template <typename T, size_t WIDTH, size_t HEIGHT>
void Grid<T, WIDTH, HEIGHT>::verifyCoordinate(size_t x, size_t y) const {
    if (x >= WIDTH) {
        throw std::out_of_range { std::format("{} must be less than {}.", x, WIDTH) };
    }
    if (y >= HEIGHT) {
        throw std::out_of_range { std::format("{} must be less than {}.", y, HEIGHT) };
    }
}

template <typename T, size_t WIDTH, size_t HEIGHT>
const std::optional<T>& Grid<T, WIDTH, HEIGHT>::at(size_t x, size_t y) const {
    verifyCoordinate(x, y);
    return m_cells[x][y];
}

template <typename T, size_t WIDTH, size_t HEIGHT>
std::optional<T>& Grid<T, WIDTH, HEIGHT>::at(size_t x, size_t y) {
    return const_cast<std::optional<T>&>(std::as_const(*this).at(x, y));
}

注意,之前你在哪里指定了 Grid<T>,現在你必須指定 Grid<T, WIDTH, HEIGHT> 來指定三個模板參數。你可以這樣實例化并使用這個模板:

Grid<int,

 10, 10> myGrid;
Grid<int, 10, 10> anotherGrid;
myGrid.at(2, 3) = 42;
anotherGrid = myGrid;
cout << anotherGrid.at(2, 3).value_or(0);

這段代碼看起來很棒,但不幸的是,存在比你最初預期的更多限制。首先,你不能使用非常量整數來指定高度或寬度。以下代碼無法編譯:

size_t height { 10 };
Grid<int, 10, height> testGrid; // 無法編譯

然而,如果你將高度定義為常量,則可以編譯:

const size_t height { 10 };
Grid<int, 10, height> testGrid; // 可編譯并工作

具有正確返回類型的 constexpr 函數也可以工作。例如,如果你有一個返回 size_t 的 constexpr 函數,你可以用它來初始化高度模板參數:

constexpr size_t getHeight() { return 10; }
...
Grid<double, 2, getHeight()> myDoubleGrid;

第二個限制可能更重要。現在寬度和高度是模板參數,它們是每個網格類型的一部分。這意味著 Grid<int,10,10> 和 Grid<int,10,11> 是兩種不同的類型。你不能將一種類型的對象賦值給另一種類型的對象,也不能將一種類型的變量傳遞給期望另一種類型變量的函數或方法。

注意:非類型模板參數成為實例化對象類型規范的一部分。

二、類模板參數的默認值

設置高度和寬度的默認值

如果您繼續使用高度和寬度作為模板參數的方法,您可能想為 Grid<T> 類構造函數中之前的高度和寬度非類型模板參數提供默認值。C++ 允許您使用類似的語法為模板參數提供默認值。同時,您也可以為 T 類型參數提供默認值。下面是類定義:

export template <typename T = int, size_t WIDTH = 10, size_t HEIGHT = 10>
class Grid {
    // 其余部分與之前版本相同
};

在方法定義的模板規范中,您不需要為 T、WIDTH 和 HEIGHT 指定默認值。例如,這是 at() 方法的實現:

template <typename T, size_t WIDTH, size_t HEIGHT>
const std::optional<T>& Grid<T, WIDTH, HEIGHT>::at(size_t x, size_t y) const {
    verifyCoordinate(x, y);
    return m_cells[x][y];
}

現在,您可以在沒有任何模板參數的情況下實例化 Grid,只需指定元素類型,元素類型和寬度,或元素類型、寬度和高度:

Grid<> myIntGrid;
Grid<int> myGrid;
Grid<int, 5> anotherGrid;
Grid<int, 5, 5> aFourthGrid;

請注意,如果您不指定任何類模板參數,您仍然需要指定一組空的尖括號。例如,以下代碼無法編譯!

Grid myIntGrid;

類模板參數列表中默認參數的規則與函數或方法相同;也就是說,您可以從右邊開始為參數提供默認值。

三、類模板參數推導(CTAD)

1.自動推導模板參數

類模板參數推導允許編譯器自動從傳遞給類模板構造函數的參數推導出模板參數。例如,標準庫中有一個名為 std::pair 的類模板,在 <utility> 中定義,并在第1章中介紹。pair 存儲兩個可能不同類型的值,通常需要指定為模板參數。例如:

pair<int, double> pair1 { 1, 2.3 };

為了避免編寫模板參數,可以使用一個名為 std::make_pair() 的輔助函數模板。編寫自己的函數模板的細節將在本章后面討論。函數模板一直支持基于傳遞給函數模板的參數自動推導模板參數。因此,make_pair() 能夠根據傳遞給它的值自動推導出模板類型參數。例如,編譯器為以下調用推導出 pair<int, double>:

auto pair2 { make_pair(1, 2.3) };

使用類模板參數推導(CTAD),不再需要這樣的輔助函數模板。編譯器現在會根據傳遞給構造函數的參數自動推導出模板類型參數。對于 pair 類模板,您可以簡單地編寫以下代碼:

pair pair3 { 1, 2.3 }; // pair3 的類型為 pair<int, double>

當然,這僅在類模板的所有模板參數要么具有默認值,要么用作構造函數中的參數,從而可以推導出來時才有效。請注意,CTAD 要求有一個初始化器才能工作。以下是非法的:

pair pair4;

許多標準庫類支持 CTAD,例如 vector、array 等。

注意:這種類型推導對 std::unique_ptr 和 shared_ptr 無效。您向它們的構造函數傳遞 T*,這意味著編譯器必須在推導 <T> 或 <T[]> 之間選擇,如果選錯了就會很危險。因此,請記住,對于 unique_ptr 和 shared_ptr,您需要繼續使用 make_unique() 和 make_shared()。

2.用戶定義的推導指南

您也可以編寫自己的用戶定義推導指南來幫助編譯器。這些指南允許您編寫模板參數如何被推導的規則。這是一個高級主題,所以不會詳細討論,但會給出一個示例來展示它們的強大功能。假設您有以下 SpreadsheetCell 類模板:

template <typename T>
class SpreadsheetCell {
public:
    SpreadsheetCell(T t) : m_content { move(t) } { }
    const T& getContent() const { return m_content; }

private:
    T m_content;
};

使用自動模板參數推導,您可以創建一個 std::string 類型的 SpreadsheetCell:

string myString { "Hello World!" };
SpreadsheetCell cell { myString };

然而,如果您將 const char 傳遞給 SpreadsheetCell 構造函數,則類型 T 被推導為 const char,這不是您想要的!您可以創建以下用戶定義的推導指南,當向構造函數傳遞 const char* 作為參數時,使其將 T 推導為 std::string:

SpreadsheetCell(const char*) -> SpreadsheetCell<std::string>;

這個指南必須在類定義之外但在與 SpreadsheetCell 類相同的命名空間內定義。通用語法如下。explicit 關鍵字是可選的,其行為與構造函數的 explicit 相同。通常,這樣的推導指南也是模板。

explicit TemplateName(Parameters) -> DeducedTemplate;
責任編輯:趙寧寧 來源: coding日記
相關推薦

2024-01-17 23:10:59

C++函數模板開發

2023-09-25 12:12:01

C++自動返回

2024-02-19 08:11:40

C++編程尾返回類型推導

2010-02-03 17:42:33

C++模板參數

2010-02-04 14:22:25

C++函數模板非類型參

2010-02-04 14:01:43

C++非類型類模板參數

2024-12-19 11:30:00

C++17CTAD代碼

2010-09-28 10:23:36

SQL修改字段

2022-11-14 07:08:23

Python函數參數

2012-08-01 09:50:11

交互設計UI設計

2024-04-29 07:48:04

C++FinalOverride

2023-09-01 21:20:06

授權委派KPI

2010-01-08 16:52:57

C++和C#

2009-09-11 12:31:15

C# WinForm控設置默認值

2009-08-31 14:34:46

C#值類型C#結構類型

2010-01-28 13:45:06

C++數組

2024-01-29 01:30:00

函數C++編程

2016-12-20 16:35:52

NodeJSC++類型轉換

2016-12-07 11:23:52

NodeJSC++

2021-02-25 13:40:17

MySQL數據庫默認值
點贊
收藏

51CTO技術棧公眾號

尤物九九久久国产精品的分类| 国产黄色免费在线观看| 高h视频在线播放| 爽爽淫人综合网网站| 亚洲欧美国产高清| 啪一啪鲁一鲁2019在线视频| 一个人看的视频www| 夜夜骚av一区二区三区| 麻豆精品少妇| 亚洲国产一区视频| 91久久精品一区| 国产传媒国产传媒| 中文在线а√在线8| www.色精品| 久久久久久亚洲精品| 激情文学亚洲色图| 日本中文字幕在线2020| 日本成人中文字幕在线视频 | 中文字幕免费观看| 国产精品黄网站| 亚洲精品乱码久久久久久日本蜜臀| 国产精品成人v| 天天躁日日躁aaaa视频| 麻豆视频在线观看免费网站黄| 成人免费毛片a| 久久免费视频在线| 免费看毛片的网站| 91禁在线看| 北岛玲一区二区三区四区| 国产精品成人一区| 一级免费在线观看| 日韩三级视频| 在线免费不卡电影| 手机看片福利永久国产日韩| 啪啪小视频网站| 日本大胆欧美| 在线电影欧美成精品| 青春草在线视频免费观看| 一卡二卡三卡在线观看| 欧美一区二区| 日韩欧美123| 国产精品一线二线三线| 无码精品黑人一区二区三区| 国产精品久久久久久久久久妞妞| 日韩电视剧免费观看网站| av动漫在线观看| wwwww在线观看免费视频| 麻豆精品国产传媒mv男同| 久久精品成人一区二区三区| 女人扒开腿免费视频app| yiren22亚洲综合| 亚洲天天做日日做天天谢日日欢| 99久久无色码| 午夜精品三级久久久有码| 中文字幕亚洲影视| 欧美挠脚心视频网站| 免费日韩视频在线观看| 三级在线看中文字幕完整版| 亚洲高清视频的网址| 欧美极品日韩| 国产精品久久久久久久免费看| 欧美成人一品| 久久久国产精品一区| 成人无码精品1区2区3区免费看| 亚洲tv在线| 午夜欧美2019年伦理| 欧美日韩一区二| 青青草娱乐在线| 精品一区二区三区免费播放| 国色天香2019中文字幕在线观看| 久久久91视频| 香蕉大人久久国产成人av| 色婷婷综合激情| 中文字幕色呦呦| 毛片在线播放网址| 国产成人av电影免费在线观看| 欧美一区深夜视频| 少妇被躁爽到高潮无码文| 小嫩嫩12欧美| 亚洲人午夜精品免费| 日本黄色三级网站| 91精品入口| 欧美日韩亚洲综合一区 | 老司机免费视频| 欧美电影免费网站| 欧美精选在线播放| 无套内谢丰满少妇中文字幕 | 午夜一区二区三区在线观看| 精品少妇人妻av免费久久洗澡| a√资源在线| 99久久综合色| 欧美精品国产精品久久久 | 国产日韩av一区| 成人激情直播| 日本电影一区二区在线观看| 中文字幕精品一区| 久久精品日产第一区二区三区精品版| 在线观看毛片网站| 国产精品中文字幕日韩精品 | 成人免费黄色在线| 免费99视频| 精品人妻一区二区三区换脸明星| 日韩av中文在线观看| 97人人模人人爽人人喊中文字| 波多野结衣在线网址| 色婷婷狠狠五月综合天色拍 | 日本午夜一区二区| 亚洲自拍偷拍网址| 91国产精品一区| 福利一区在线观看| 欧美中日韩免费视频| 亚洲人午夜射精精品日韩| 国产精品丝袜黑色高跟| 国产成人永久免费视频| 69成人在线| 国产精品视频在线看| 免费人成在线观看视频播放| 国模视频一区| 91激情五月电影| 成年人免费在线播放| 96sao精品免费视频观看| 欧美日韩精品专区| 可以看污的网站| 亚洲一区av| 精品亚洲va在线va天堂资源站| 亚洲一区二区在线免费| 久久影视一区| 欧美成人午夜视频| 丰满少妇高潮久久三区| 欧美激情无毛| 久久男人的天堂| 国产精品久久久久久久久久久久久久久久| 91亚洲精品久久久蜜桃网站| 欧美亚洲免费在线| 神马午夜伦理不卡| 午夜精品福利视频网站| 国产乱码一区二区三区四区| 欧美日韩国产一区二区三区不卡| 亚洲午夜激情免费视频| 美国黄色特级片| 国产精品久久久久久麻豆一区软件| 精品国产拍在线观看| 欧洲第一无人区观看| 日本中文在线一区| 女同一区二区| 国产调教在线| 欧美亚洲动漫精品| 99999精品| 久久婷婷蜜乳一本欲蜜臀| 国产99久久精品一区二区 夜夜躁日日躁 | 久久资源免费视频| 精品久久免费视频| 久热re这里精品视频在线6| 国产欧美日韩一区二区三区| 日韩av成人| 午夜精品123| 50一60岁老妇女毛片| 亚洲午夜久久久久久尤物| 欧洲美女免费图片一区| 色av男人的天堂免费在线| 精品福利在线视频| 亚洲黄色av片| 99热国内精品| 91亚洲精华国产精华| 直接在线观看的三级网址| 日韩你懂的电影在线观看| 久操免费在线视频| 成人免费一区| 国产欧美精品一区| 先锋影音网一区| 你懂得影院夜精品a| 亚洲欧洲第一视频| 中文字幕视频二区| 国v精品久久久网| 久久99久久99精品| 欧美人成在线观看ccc36| 青青青国产精品一区二区| 青春有你2免费观看完整版在线播放高清 | 日韩一级在线观看| 久久久亚洲av波多野结衣| 无码一区二区三区视频| 成人信息集中地欧美| 你懂的在线观看视频网站| 一本久道久久综合中文字幕| 欧洲av一区二区三区| 看片网站欧美日韩| 国产激情片在线观看| 成人黄色图片网站| 精品一区二区三区四区在线| 免费看一级视频| 成人听书哪个软件好| 日韩avxxx| 91精品久久久久久综合五月天| 国产综合在线视频| 国产片在线观看| 日韩一级黄色大片| 欧美三级午夜理伦| 国产精品网站在线观看| 国产精品日日摸夜夜爽| 91中文字幕精品永久在线| 97影院在线午夜| 浪潮av一区| 精品视频在线视频| 国产亚洲成人av| 国产日韩高清在线| 免费啪视频在线观看| 久久久天天操| 欧美 日韩 国产精品| 妖精一区二区三区精品视频| 国产一区二区在线免费| 91xxx在线观看| 精品久久国产老人久久综合| 精品人妻伦九区久久aaa片| av中文字幕亚洲| 日本不卡一区二区在线观看| 欧美a级片免费看| 精品国产一级| 日韩高清免费在线| 九热这里只有精品| 国产a区久久久| 中文字幕国产传媒| 欧美中文一区二区| 91中文字幕一区| 黄在线观看免费网站ktv| 色婷婷av一区二区三区在线观看| 成年人晚上看的视频| 欧美激情综合五月色丁香| 一级黄色大片免费看| 黄色av一区| 在线成人性视频| 欧美成人精品午夜一区二区| 国产91色在线免费| 成年人黄色大片在线| 欧美另类老女人| 丰满少妇一级片| 亚洲成a人片在线不卡一二三区| 老司机福利在线观看| 黑人巨大精品欧美一区| 日韩不卡视频一区二区| 日本大胆欧美| 日本最新一区二区三区视频观看| 国产三级一区| 欧美成人性生活| 午夜视频在线免费观看| 亚洲老头老太hd| 中文字幕在线观看精品| 色综合久久九月婷婷色综合| 亚洲视频免费播放| 亚洲一区二区精品久久av| 日韩视频中文字幕在线观看| 国产精品你懂的在线欣赏| 99日在线视频| 精品影视av免费| 亚洲综合婷婷久久| 欧美涩涩网站| 日韩人妻一区二区三区蜜桃视频| 久久久久久美女精品| 精品999在线观看| 国产精品久久乐| 国产精品久久久久久久久免费| 超碰在线caoporen| 亚洲激情成人网| 这里只有精品999| 欧美自拍偷拍午夜视频| 中国一级特黄视频| 欧美日韩在线播放| 亚洲视频一区在线播放| 欧美日韩电影在线| 99国产成人精品| 色综合久久天天| 久久久久久av无码免费看大片| 在线看日韩精品电影| 亚洲一卡二卡在线| 91精品国产一区二区三区香蕉| 久久久久亚洲av成人毛片韩| 综合自拍亚洲综合图不卡区| 免费中文字幕av| 国产精品一区二区久激情瑜伽| 中文字幕在线视频一区二区| 国产激情91久久精品导航| 亚洲少妇第一页| 久久精品99国产国产精| 国产资源中文字幕| 岛国一区二区在线观看| 亚洲制服丝袜在线播放| 国产美女在线精品| 日韩av片网站| 亚洲中午字幕| 国产一区二区三区小说| 99热精品在线观看| 国产精品第157页| 亚洲一区日韩| www午夜视频| 成人丝袜视频网| 妖精视频在线观看免费| 一区二区三区中文字幕在线观看| 亚洲 欧美 日韩 综合| 精品视频在线免费| 亚洲大尺度视频| 777久久久精品| 中文字幕永久在线观看| 欧美成va人片在线观看| 国产一级片在线播放| 精品视频偷偷看在线观看 | 伊人伊人伊人久久| av超碰免费在线| 日韩av色综合| 伊色综合久久之综合久久| 欧美最大成人综合网| 欧美一区亚洲| 国产一线二线三线在线观看| 国产成人高清在线| av永久免费观看| 香蕉成人伊视频在线观看| 国产免费黄色大片| 亚洲视频电影图片偷拍一区| 黄色美女视频在线观看| 国产美女91呻吟求| 另类一区二区| 国产一区二区三区免费不卡| 天天做天天爱天天爽综合网| 男人操女人免费| 国产999精品久久久久久| 天美传媒免费在线观看| 色综合天天性综合| 黑人精品一区二区三区| 久久视频在线看| 99亚洲伊人久久精品影院| 久久av一区二区| 国产尤物精品| 黄色片子免费看| 亚洲欧洲日产国产综合网| 手机在线看片1024| 日韩国产激情在线| 国产精品一二三产区| 5566中文字幕一区二区| 亚洲国产精品日韩专区av有中文| 中文字幕第36页| 国产三级精品三级| 一本一道无码中文字幕精品热| 亚洲国产精品成人一区二区| 日韩偷拍自拍| 国色天香2019中文字幕在线观看| 日韩三级不卡| 大陆极品少妇内射aaaaaa| 激情欧美一区二区| 日本裸体美女视频| 欧美日韩在线综合| 97超碰人人在线| 国产日韩欧美自拍| 国产精品88久久久久久| 中文字幕免费高清在线| 国产精品久久久久久久浪潮网站| 国产免费无码一区二区视频| 欧美日韩1234| 免费看a在线观看| 午夜伦理精品一区| 99热这里只有精品首页 | 亚洲欧美日韩国产中文在线| 国产毛片一区二区三区va在线| 色悠悠久久久久| 色成人综合网| 欧洲精品视频在线| 成人精品一区二区三区四区| 激情综合丁香五月| 天天影视涩香欲综合网| 头脑特工队2在线播放| xxav国产精品美女主播| vam成人资源在线观看| www.激情网| av中文一区二区三区| 亚洲 欧美 中文字幕| 中文字幕亚洲专区| av手机在线观看| 久久婷婷国产综合尤物精品| 天堂精品中文字幕在线| 懂色av蜜臀av粉嫩av永久| 91精品国产色综合久久不卡蜜臀 | 日韩美女免费视频| 日本久久综合| 91人妻一区二区三区| 午夜精品国产更新| 国产高清视频在线播放| 91久热免费在线视频| 在线欧美亚洲| 欧美日韩精品区别| 一级做a爱片久久| 在线免费观看一区二区| 久久综合久中文字幕青草| 国产精品色呦| 午夜精品在线免费观看| 亚洲精品日韩综合观看成人91| 三级视频在线看| 欧美日本国产在线| 午夜a一级毛片亚洲欧洲| 三级在线视频观看| 亚洲午夜影视影院在线观看| 国产黄色片在线播放| 成人高清在线观看| 青青草97国产精品免费观看无弹窗版|