首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Effective Modren C++》 进阶学习(上)

理解模板类型推导 模板类型推导(template type deduction)指的是编译器通过函数参数的类型来推断模板参数的类型,从而确定函数模板的实例化类型。...某些情况下,ParamType并不是和函数参数类型一样,而是依据参数推导出的(划重点) 使用模板: template void f(ParamType param); // ParamType...,类型是void(*)(int, double) f2(someFunc); //param被推导为指向函数的引用,类型为void(&)(int, bouel) 「小结」 在模板类型推导时,有引用的实参会被视为引用...理解auto类型推导 在大部分情况下auto推导模板类型推导一致,仅当变量使用花括号初始化时,auto能够推导成std::initializer_list,而模板类型推导则无法推导。...constexpr常量可以在编译时被用作常量表达式,例如作为数组大小、模板参数或其他需要常量表达式的上下文中使用。这样可以提高代码的灵活性和可读性。 编译时错误检查。

17120
您找到你想要的搜索结果了吗?
是的
没有找到

【C++11】让程序更简洁——模板

二、模板的别名 在C98中,可以使用typedef重定义一个类型,如: typedef unsigned int uint_t; 在上面的代码中符号整型类型被重新定义,但并不是新增一种类型,只是给已存在的类型重新定义了一个别名...C++11的using语法提供的功能已经涵盖了typedef的所有功能,如在一开始定义的符号整型的别名也可以这样定义: using uint_t = unsigned int; 由此可以看出,typedef...三、函数模板的默认模板参数 在C98中,类模板可以有默认模板参数,函数模板中的默认模板参数是不被支持的,这一限制,在C++11中得到了解除。...如: func(123);//func的返回值为long long 还有一种使用方式是将函数模板默认参数模板参数自动推导一起使用,在一起使用时,如果函数模板无法自动推导,将会使用默认模板参数...,但因为指定了默认参数模板类型,因此,在func(123)中,func的val参数将为int整型,在func(123,123.0)中,第二个参数为浮点行,模板参数T将优先被推导,自动推导生效时,默认模板参数会被直接忽略

65330

C++ 初识函数模板

2.3 实参推导所谓实参推导,在使用函数模板时省略,不明确指定数据类型参数,而是由编译器根据函数的实参类型自动推导出类型参数的真正类型。...但是实参推导是有前提条件的:函数参数使用了类型参数的才能通过函数实参类型推导。如下的函数模板。...double res= myMax(6,8); //正确是否可以让函数模板的类型参数一部分显示指定,一部分由实参推导?...答案是可以,但是,要求在声明函数模板时,把需要显示指定的类型参数放在前面,可由实参推导参数类型放在后面。把上面的函数模板的 T1、T2参数说明交换位置。...如果即想使用实参推导,且想使用函数模板而非普通函数,可以使用空 尖括号语法。如上的 getMax(7,7);调用。一旦指定标识符,显示指定使用函数模板,无论其中是否有实参类型说明。

59040

从零开始学C++之模板(一):函数模板、函数模板特化、重载函数模板、非模板函数重载

的对象的类型参数化,使一段程序代码可以用于处理多不同类型的对象。...函数模板不是函数,不能被执行 置换代码中的类型参数得到模板函数——实例化 实例化后的模板函数是真正的函数,可以被执行 3、模板被编译了两次 实例化之前,先检查模板代码本身,查看语法是否正确;...实例化期间,检查模板代码,查看是否所有的调用都有效。在这里会发现无效的调用,如该实例化类型不支持某些函数调用或操作符等。...模板匹配,进而自动推导     cout <<::max('a', 50) << endl; // 'a'即97;选择非模板函数(char可以隐式转换成int)     cout <<::max(97...const int&, const int&)     return 0; } 函数模板可以通过传递的参数类型自动推导,查看是否有合适的函数实例可用,而类模板则必须显式说明模板的类型参数,这样才能实例化模板类实例

1.9K00

C++20新特性个人总结

2.6  从构造函数推导模板参数类型  2.7  基于范围的for循环初始化  2.8  简化lambda的隐式捕获  2.9  ADL与不可见的模板函数  2.10  operator ...  2.25  unicode字符串字面量  2.26  允许转换成未知边界的数组  2.27  聚合初始化推导模板参数  2.28  隐式地将返回的本地变量转换为右值引用  2.29  允许default...  声明变量时进行初始化,如果能从构造函数中推导出变量类型,则该变量的类型可以不用指定模板参数。 ...  比较拗口,放松了非类型模板参数的限制,可以用类类型作为模板参数,但是条件是所需要的运算需要在编译期完成。 ...2.27  聚合初始化推导模板参数  通过聚合初始化中的参数类型 来 推导出类模板参数类型  例子:  template struct S  {     T x;     T

1.9K50

C++ 学习笔记

2.基于引用折叠和 std::forward,可以实现完美转发:将传入将被参数的基本特性(是否 const,左值、右值引用)转发出去。...实际应用时,可以根据函数作用加以选择,若要比较大小,一般是按照引用传递;若是比较参数类型是否相同,则可以是按值传递。 7.5 处理返回值 1.函数返回值也可以是按值返回或按引用返回。...也可以将类型模板参数定义为友元 。 可以将函数模板定义为友元,此时若模板参数推导,在友元声明时可以省略。...,编译器会根据实参的类型和模板参数 T 定义的形式,推导出函数的各个参数的类型,如果最后推导的结论矛盾,则推导失败。...2.类中定义了类型转换的模板函数时,在类型转换时可以产生实参推导

6.6K63

【C++11】移动赋值 | 新的类功能 | 可变参数模板

若实现了其中任意一个,则说明是深拷贝的类,如何转移应该自己说了算) 编译器就会自动生成一个默认移动赋值 默认生成的移动赋值, 对于内置类型成员,会执行浅拷贝(按字节拷贝) 对于自定义类型成员,则看这个成员是否实现移动赋值...可变参数模板可以接受可变参数的函数模板和类模板 声明一个参数包Args...args,这个参数包中包含0到任意个模板参数 ---- 参数是不限制类型和个数的 ---- 可变参数包的解析 通过增加一个模板参数...,让编译器去解析参数包的东西 应用递归推导思维 ---- 主函数中的test是参的,所以调用参的test函数 ---- 当有一个参数a是,将a传给test作为第一个参数val,而test的第二个参数作为参数包就没有了...(参数可以包含0个参数) 在带有形参的test函数中调用参的test函数,进行换行 ---- 当有两个参数a和b时,将a传给test作为第一个参数val,将b传给test作为第二个参数 参数包...test时,由于参数参数为0,所以去调用 参的test ,进行换行

16050

Modern c++快速浅析

,例如C++11中可以将其用于匿名函数参数推导 // 使用auto接住匿名函数,匿名函数使用auto进行参数推导,匿名函数的返回值使用auto推导 auto MyLambda = [](auto a..., auto b) { return a + b; }; 由于它也是遵循模板类型推导的原则,因此对于大括号初始物而言,参数还是返回值都无法正确的将其推导出来 Range-base-loop with auto...(包括内置类型和自定义类型),以及可以用来修饰函数(构造函数,成员函数,普通函数等等),如果以constexpr修饰构造函数,那么代表构造出来的对象可以是一个编译期常量 以修饰函数为例,函数是否的返回值是否满足...constexpr取决于两个方面 •传入的参数是否是编译期常量•函数体内的计算是否是编译期能够处理的 当两者条件都能满足时,它的结果就是constexpr的,否则它的运作方式和普通函数无异(编译器不对constexpr...}•当Lambda表达式没有捕获任何参数时,它可以转换成为一个函数指针•Lambda中可以直接使用静态变量以及全局变量,不存在捕获的行为。

15910

Effective Modern C++翻译(2)-条款1:明白模板类型推导

如果你愿意忽略少量的伪代码,我们可以直接对下面的模板函数的代码进行思考。...数组参数 上面这些已经覆盖了模板类型推导的主流部分,但是还有一些边边角角的地方值得我们了解,数组的类型和指针的类型是有不同的,即使他们有的时候看起来是可以互相交换的,这个错觉的主要贡献来源于此,在很多环境中...因为数组参数的声明被按照指针的声明而对待,通过按值的方式传递给一个模板参数的数组将被推导为一个指针类型,这意味着在下面这个模板函数f的调用中,参数T的类型被推导为const char* f(name);...// name是一个数组,但是T被推导为const char* 但是现在来了一个曲线球,尽管函数不能声明一个真正意义上的数组类型的参数,但是他们可以声明一个指向数组的引用,所以如果我们把模板f改成按引用传递参数...请记住: 当模板参数是一个指针或是一个引用,但不是一个万能引用(universal reference)时,实例化的表达式是否是一个引用将被忽略。

766100

C++模版的本质

这个时候,就希望这个类是可以参数化的(属性参数化),可以根据不同类型的参数进行属性配置,继而生成不同的类。类模板就应运而生了,类模板就是用来实现参数化的容器类。 ? 什么是通用算法?...: 函数模板的签名包括模板参数,返回值,函数名,函数参数, cv-qualifier; 函数模板编译顺序大致:名称查找(可能涉及参数依赖查找)->实参推导->模板实参替换(实例化,可能涉及 SFINAE...)->函数重载决议->编译; 函数模板可以在实例化时候进行参数推导,必须知道每个模板的实参,但不必指定每个模板的实参。...); 函数模板实例化过程中,参数推导不匹配所有的模板或者同时存在多个模板实例满足,或者函数重载决议有歧义等,实例化失败; 为了编译函数模板调用,编译器必须在非模板重载、模板重载和模板重载的特化间决定一个歧义最佳的模板...模板实参推导 模板实参推导机制给与编译器可以通过实参去反推模板的形参,然后对模板进行实例化,具体推导规则见参考; 4.

1.7K30

浅谈 C++ 元编程

C++ 中的 模板参数 (template parameter / argument) 可以分为三种:值参数,类型参数模板参数。...尽管 模板参数可以当作一般的 类型参数 进行传递(模板也是一个类型),但之所以单独提出来,是因为它可以实现对传入模板参数匹配。...转化为常量表达式,类似测试表达式实现重载的选择(但需要添加一个冗余的 函数参数/函数返回值/模板参数); std::void_t 直接 检查依赖 的成员/函数是否存在,不存在则无法重载(可以用于构造谓词...是否为特定的类型 的判断,类似于代码,将 unsigned Val 改为 typename Type;并把传入的模板参数由 值参数 改为 类型参数,根据最优原则匹配重载。...利用表达式模板可以实现部分求值、惰性求值、表达式化简等特性。 3.2 类型推导 除了基本的数值计算之外,还可以利用元编程进行任意类型之间的相互推导

2.9K60

C++ auto 关键字的使用

是否会造成编译期的时间消耗,我认为是不会的,在未使用auto时,编译器也需要得知右操作数的类型,再与左操作数的类型进行比较,检查是否可以发生相应的转化,是否需要进行隐式类型转换。...在定义模板函数时,用于声明依赖模板参数的变量类型。...模板函数依赖于模板参数的返回值template auto multiply(_Tx x, _Ty y)->decltype(x*y){ return...x*y;}当模板函数的返回值依赖于模板参数时,我们依旧无法在编译代码前确定模板参数的类型,故也无从知道返回值的类型,这时我们可以使用auto。...decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。

4.1K31

C++之函数模板的深入理解学习总结

一、函数模板的深入理解: 1、函数模板深入理解: 编译器从函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译 -对模板代码本身进行编译,比如检查函数模板是否有语法上的错误 -对参数替换后的代码进行编译...;也就是说,我们在调用函数模板的时候,编译器根据实际的参数类型,从而得到真正的函数,这个时候编译器会对这个函数进行第二次编译 2、注意事项: 函数模板本身不允许隐式类型转换 -自动推导类型时,必须严格匹配...T为Test类,也就是Swap(T&,T&),然后就报了一个错误,说拷贝构造函数是私密的,所以也就导致Test c =a这里报错了 3、多参数函数模板 (1)函数模板可以定义任意多个不同的类型参数 template...无法自动推导返回值类型 可以从左向右部分指定类型参数 //T1 = int, T2 = double, T3 = double int r1 =Add(0.5,0.8); //T1 = int...函数模板可以定义任意多个不同的类型参数 函数模板中的返回值类型必须显示指定 函数模板可以像普通函数一样被重载 好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

23410

【C++ 程序设计入门基础】- 第4节-函数

;i<n;i++){ cout<<c[i]<<endl; } return 0; } int add(int a,int b){//函数定义 return a+b; } 运行结果如下:  返回值...print(n); return 0; } void print(int n){//函数定义 for(int i=1;i<=n;i++){ cout<<i<<endl; } } 运行结果:  参数...C++提供两种模板机制:函数模板和类模板 函数模板作用: 建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。...,可以用class代替 T --- 通用的数据类型,名称可以替换,通常为大写字母 函数模版使用示例: //交换整型函数 void swapInt(int& a, int& b) { int temp...使用函数模板有两种方式:自动类型推导、显示指定类型 模板的目的是为了提高复用性,将类型参数

15610

现代C++之万能引用、完美转发、引用折叠(万字长文)

"T需要是一个被推导类型"这个要求限制了universal references的出现范围。 在实践当中,几乎所有的universal references都是函数模板参数。...在每一个例子当中,如果你看到T&& (其中T是模板参数),那这里就有类型推导,那T&&就是universal reference。...means universal reference 有的时候你可以在函数模板的声明中看到T&&,但却没有发生类型推导。...在对一个 universal reference 的模板参数进行类型推导时候,同一个类型的 lvalues 和 rvalues 被推导为稍微有些不同的类型。...推导一个universal reference的 auto 变量的类型,在本质上和推导universal reference的函数模板参数是一样的,所以类型 T 的lvalue被推导为 T&,类型 T

6.3K21

C++11函数模板的默认模板参数

1.函数模板默认模板参数简介 函数模板与类模板在C++98一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板可以。从C++11开始,这个限制被解除了,即函数模板同样可以拥有默认模板参数。...,不按照从右往左指定函数的默认参数和类模板的默认模板参数均导致编译错误,而在C++11中,函数模板的默认模板参数出现的位置则比较灵活,可以出现在任意位置。...2.3函数模板参数推导规则 函数模板参数推导规则是如果能够从函数实参中推导出类型的话,则函数模板的默认模板参数则不会被使用,反之,默认模板参数则可能被使用。...而函数调用testTemplateFunc()则因为无法推导出第一个模板参数T,导致编译出错。...从上面的例子也可以看出,因为函数模板模板参数是由函数的实参推导而来,所以默认模板参数通常需要跟默认函数参数一起使用,不然默认模板参数的存在将没有意义。

2.4K20

【C++】侯捷C++面向对象高级编程(下)

---- 函数模板(function template) 使用不需要指定类型。 编译器会自动进行实参推导。 说明: 首先编译模板。 接着再次编译,判断stone类型的运算是否合法。...范围上的偏 例如,从接收任意范围T,到接收指针T* ---- 模块模板参数(tempalte template parameter) 即,模板参数又是一个模板 如上图所示,传递任意的容器与元素类型进行组合...但是第二个OK 这个不是模板模板参数 调用中我们使用第二种方法,指明第二模板参数,其实这个list就已经不是模板了,已经指明了,即使它是用模板设计出来的东西。...所以temp>第二个参数,不是模板模板参数。...---- 重载pleacement new,pleacement delete 类的成员函数,可以重载多个版本,每一个版本都要有独一二的参数列。

63820

Chapter 5: Rvalue References, Move Semantics, PF

Understand reference collapsing 当模板函数的参数是一个通用引用参数时,当一个参数传递给这个模板函数,模板参数推导的类型才会编码这个参数是左值还是右值。...编码机制是:当传递的参数是一个左值时,模板参数推导为左值引用;当传递的参数是一个右值时,模板参数被推到为一个非引用。...,以及函数f定义的参数类型,然后比较他们是否兼容,如果有必要,就执行隐式转换 通过完美转发间接调用f的时候,编译器就不会对在fwd调用点传递的参数和f声明的参数进行比较;而是会拿从fwd推导参数类型和函数...而标准规定:向函数模板传递一个花括号初始化的参数,而模板参数又没有指定参数类型为std::initializer_list,那么这就是一个不可推导的情况。...,在模板函数中就可以进行匹配。

5.1K40
领券