详解c++11新特性之模板的改进

 更新时间:2020年05月06日 08:36:32   投稿:zx  
这篇文章主要介绍了详解c++11新特性之模板的改进,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

C++11关于模板有一些细节的改进:

  • 模板的右尖括号
  • 模板的别名
  • 函数模板的默认模板参数

模板的右尖括号

C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误。

int main() {
  std::vector<std::vector<int>> a; // error
  std::vector<std::vector<int> > b; // ok
}

这个我之前都不知道,我开始学编程的时候就已经是C++11的时代啦。

模板的别名

C++11引入了using,可以轻松的定义别名,而不是使用繁琐的typedef。

typedef std::vector<std::vector<int>> vvi; // before c++11
using vvi = std::vector<std::vector<int>>; // c++11

使用using明显简洁并且易读,大家可能之前也见过使用typedef定义函数指针之类的操作,那烂代码我就不列出来了,反正我是看不懂也不想看...以后都可以使用using,额还是列出来吧。

typedef void (*func)(int, int); // 啥玩意,看不懂
using func = void (*)(int, int); // 起码比typedef容易看的懂吧

上面的代码使用using起码比typedef容易看的懂一些吧,但是我还是看不懂,因为我从来不用这种来表示函数指针,用std::function()、std::bind()、std::placeholder()、lambda表达式它不香吗。

函数模板的默认模板参数

C++11之前只有类模板支持默认模板参数,函数模板是不支持默认模板参数的,C++11后都支持。

template <typename T, typename U=int>
class A {
   T value; 
};

template <typename T=int, typename U> // error
class A {
   T value; 
};

类模板的默认模板参数必须从右往左定义,而函数模板则没有这个限制。

template <typename R, typename U=int>
R func1(U val) {
  return val;
}

template <typename R=int, typename U>
R func2(U val) {
  return val;
}

int main() {
  cout << func1<int, double>(99.9) << endl; // 99
  cout << func1<double, double>(99.9) << endl; // 99.9
  cout << func1<double>(99.9) << endl; // 99.9
  cout << func1<int>(99.9) << endl; // 99
  cout << func2<int, double>(99.9) << endl; // 99
  cout << func1<double, double>(99.9) << endl; // 99.9
  cout << func2<double>(99.9) << endl; // 99.9
  cout << func2<int>(99.9) << endl; // 99
  return 0;
}

对于函数模板,参数的填充顺序是从左到右的。

关于C++11对于模板的改进就讲到这里,请继续关注~

参考资料

《深入应用C++11:代码优化与工程级应用》

https://blog.csdn.net/tennysonsky/article/details/77817027

https://blog.csdn.net/wf19930209/article/details/79309881?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1

到此这篇关于c++11新特性之模板的改进的文章就介绍到这了,更多相关c++11新特性之模板的改进内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解C++异常处理

    深入了解C++异常处理

    任何东西都可以认为是异常,错误只是异常的一种。本文将带大家了解C++中异常是什么,是如何捕获和处理的等相关知识。文中示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2021-12-12
  • Qt实现验证码相关功能的代码示例

    Qt实现验证码相关功能的代码示例

    验证码的原理基于人类视觉和计算机视觉的差异性,通过给用户显示一些难以被机器识别的图形或文字,让用户进行人机交互,确认自己的身份,这样可以有效保护网站安全,所以本给大家介绍了Qt实现验证码相关功能的代码示例,感兴趣的朋友可以参考下
    2024-01-01
  • 利用Matlab实现阴影柱状图的绘制

    利用Matlab实现阴影柱状图的绘制

    阴影柱状图绘制的代码MATHWORKS上也有,不过是生成图片后,识别图像上不同颜色块并直接修改像素生成阴影线。这样的生成方式不可逆且自由度较低,所以本文为大家带来的是一个直接画线条填充的硬画版本,希望有所帮助
    2022-09-09
  • C++之std命名空间

    C++之std命名空间

    这篇文章主要介绍了C++之std命名空间使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C++日期类(Date)实现的示例代码

    C++日期类(Date)实现的示例代码

    这篇文章主要为大家详细介绍了如何利用C++语言实现日期类(Date),可以实现确定某年某月有多少天、打印日期等功能,感兴趣的可以了解一下
    2022-07-07
  • 基于C++编写一个Json解析器

    基于C++编写一个Json解析器

    这篇文章主要为大家详细介绍了如何基于C++编写一个Json解析器,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++中std::transform的使用小结

    C++中std::transform的使用小结

    std::transform 是 C++ 标准库中的一个算法,本文主要介绍了C++中std::transform的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • VC运用OPENGL加载BMP纹理图的实现方法汇总

    VC运用OPENGL加载BMP纹理图的实现方法汇总

    这篇文章主要介绍了VC运用OPENGL加载BMP纹理图的实现方法,对于更好的了解OpenGL很有帮助,需要的朋友可以参考下
    2014-07-07
  • c++用指针交换数组的实例讲解

    c++用指针交换数组的实例讲解

    下面小编就为大家分享一篇c++用指针交换数组的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • C++实现快速排序(Quicksort)算法

    C++实现快速排序(Quicksort)算法

    这篇文章主要为大家详细介绍了C++实现快速排序(Quicksort)算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04

最新评论