Veriadic templates

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里面的值

posted @ 2024-04-13 18:53  俊king  阅读(3)  评论(0)    收藏  举报