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