前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++那些事之万物皆可auto

C++那些事之万物皆可auto

作者头像
公众号guangcity
发布2023-12-02 14:50:50
1120
发布2023-12-02 14:50:50
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

C++那些事之万物皆可auto

C++17引入了许多旨在提高代码表达性并减少模板代码冗余的功能。其中一个显著的增强是使用auto关键字声明非类型模板参数的能力。在某些场景,这个特性特别方便,因为它消除了显式类型声明的需要。以下我将会引入我在工作中,也就是数据库当中如何使用这一特性!

从实践中学习,本节的完整源码会上传至星球,感兴趣戳尾页二维码。

在C++17中使用auto的非类型模板参数

在数据库场景中进行排序

考虑一个与数据库相关的类Foo,你希望根据枚举表示的特定顺序进行排序:

代码语言:javascript
复制
enum class SortOrder { Ascending, Descending };

你有不同排序顺序的Foo实例:

代码语言:javascript
复制
Foo<SortOrder::Ascending> f1;
Foo<SortOrder::Descending> f2;

以前的实现方式

在C++17之前,我们可能会这样实现:

代码语言:javascript
复制
template <typename U, template <U> class T, U K>
auto GetSortOrder(const T<K>&) {
  return K;
}

然而,这可能会导致错误,因为编译器无法推断模板参数'U'。

现在的简化方式

在C++17之后,对于非类型模板参数,我们可以使用auto关键字来取代:

代码语言:javascript
复制
template <template <auto> class T, auto K>
auto GetSortOrder(const T<K>&) {
  return K;
}

这种方式更为简便,使得我们无需显式指定类型即可使用非类型模板参数。

integral_constant的简化

以前,我们可能使用以下方式实现integral_constant:

代码语言:javascript
复制
template <typename _Tp, _Tp __v>
struct integral_constant {}

而现在只需:

代码语言:javascript
复制
template <auto __v>
struct integral_constant {}

这种简化使得代码更为清晰和易读。

结论

C++17引入的auto关键字用于非类型模板参数的声明极大地简化了模板代码。通过消除繁琐的类型声明,我们能够更加直观地表达代码意图,提高代码的可读性和可维护性。在处理排序等场景时,这一特性尤为有用,让我们更专注于问题的本质,而不是模板参数的细节。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++那些事之万物皆可auto
  • 在C++17中使用auto的非类型模板参数
    • 在数据库场景中进行排序
      • 以前的实现方式
        • 现在的简化方式
          • integral_constant的简化
          • 结论
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档