Veriadic templates

俊king發表於2024-04-13

Veriadic templates

數量不定的模板引數

宣告方式:

#pragma once
#ifndef __VARIADICT__
#define __VARIADICT__

/*
為什麼需要定義這個空函式,因為傳參到最後傳入最後一位引數時後面的一組引數已經沒有了.就是0
所以這個版本就是沒有引數的.當最後一個變成0個的時候呼叫的是空方法
*/
void print() { }

template<typename T, typename... Types>
void print(const T& firstArg, const Types&... args) {
std::cout << firstArg << std::endl;
print(args...); // 注意這裡的輸出 -> 7.5是第一個引數firstArg
}

#endif // !__VARIADICT__

告訴編譯器.該函式接受模板引數 -> 兩組

  • 第一組是T

  • 第二組是args -> 個數不確定.只有在傳入的時候才知道具體有幾個

呼叫程式碼:

#include <iostream>
#include "variadic.h"

using namespace std;

int main() {
// 呼叫print
print(7.5, "hello", 42); // 7.5是第一個引數firstArg

return 0;
}

原始碼裡面的print(args...),實際上會把args...在傳給print函式.進行遞迴列印

要知道後面的args具體有幾個可以用方法sizeof...()

關鍵字auto

這是一個語法糖,由編譯器去自動推斷返回值型別

/*
在沒有關鍵字auto之前宣告型別
*/
list<string> c

list<string>::iterator ite;
ite = find(c.begin(), c.end(), target);

有了auto關鍵字以後

list<string> c;
auto ite = find(c.begin(), c.end(), target); // 他就回去自動推斷find函式的返回型別
// auto不能拿來宣告變數型別,auto在使用的同時變數必須同時賦值 -> 以下就是錯誤的
list<string> c;
auto ite;
ite = find(c.begin(), c.end(), target);

ranged-base for

新的for迴圈模式:

宣告形式:

for (decl : coll) {
statement;
}

for的左邊必須宣告一個變數.右邊coll必須是一個容器

編譯器會從右邊的容器coll找出每一個元素.把每一個元素設定到左邊的變數上.然後去做下面的內容

這個寫法就不需要像之前的寫法一樣.找到容器的長度(類似forEach)

示例程式碼:

vector<double> vec;

for (auto elem : vec)
{
cout << elem*3 << endl; // 傳遞的是值給到elem
}

如果elem每一個*3,不會影響到vec裡面的內容.因為傳遞的是值

示例程式碼2:

vector<double> vec;


for (auto& elem : vec)
{
elem *= 3; // 這裡就會影響到vec裡面的內容,因為傳遞的是引用 -> 指標地址
}

這樣的話一個一個傳出來是傳遞引用.所以elem * 3會影響vec裡面的值

相關文章