Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++17常用新特性(十)---模板特性:字符串变量当做模板参数

C++17常用新特性(十)---模板特性:字符串变量当做模板参数

作者头像
CPP开发前沿
发布于 2022-06-04 09:29:25
发布于 2022-06-04 09:29:25
1.9K00
代码可运行
举报
文章被收录于专栏:CPP开发前沿CPP开发前沿
运行总次数:0
代码可运行

在C++的历次版本发布中,对C++模板参数的标准一直保持开放的态度,且对参数的要求也在逐渐放宽。从C++17开始,非类型的模板参数也可以在使用时定义了而不必定义在不同的作用域。

1 在模板中使用字符串

在模板编程中,非类型的模板参数被限制了诸多条件,只能从以下几种类型中获取,如:枚举、对象、指针、常量以及函数的左值引用、字符串变量。对于字符串变量,使用方式和之前的版本并没有太大的区别,都不能直接在模板类型参数中使用。如下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<const char *pMsg>
class ExecptionMsg{
   //... 
};
extern const char execptionMsg[] = "Hello"; // 外 部变量
const char execptionMsg_1[] = " World!"; // 内 部 变量
void foo()
{
    ExecptionMsg<execptionMsg> msg; //编译成功
    ExecptionMsg<execptionMsg_1> msg11; // 从C++11起编译成功
    static const char execptionMsg_2[] = "Hello World!";
    ExecptionMsg<execptionMsg_2> msg17; //C++17 编译成功
    ExecptionMsg<"Hello"> msgError; //编译报错
}

如上代码所示,如果编译时没有注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ExecptionMsg<"Hello"> msgError;

编译将会报错,报错信息如下:

由此可见,在非类型的模板参数中,字符变量是不能直接使用的,在使用之前需要先进行定义。C++17除了继续遵守这个规范外,相对于之前的版本它允许在实例化模板的作用域内声明,然后使用。不得不说也算是一种进步了吧。

2 将指针作为模板实参

从C++11开始,已经允许将指针作为模板的实参,但是还有一个限制,既在模板实例化时不能将一个返回指针的函数当做模板的实参。但是从C++17开始,可以在模板中使用一个返回指针的函数当做实参,如下面的代码在C++17版本编译器中可以通过:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
using namespace std;
template<int *pMsg>
class ExecptionMsg{
   //... 
};

int iValue=10;
constexpr int *getInt()
{
  
    return &iValue;
}
int main()
{
    static int num=10;
    ExecptionMsg<&num> em;
    ExecptionMsg<getInt()> emf;
    return 0;
}

在C++14版本编译器中编译报错如下:

从报错信息可知,在C++17以前的版本中,使用指针作为模板的实参时需要对参数进行连接且不能将编译器内返回指针的函数在模板实例化时进行使用。

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

本文分享自 CPP开发前沿 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++17常用新特性
每次C++版本的发布都会带来很多新的特性,C++17也不例外,虽然有很多期待的特性没有包含进来,但是新增的特性依然挡不住它独特的魅力。
CPP开发前沿
2021/11/16
2.4K0
C++17常用新特性
【翻译】C++17的新特性简介
上一篇翻译了C++14的新特性简介,这篇就是Anthony Calandra在https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md 中对C++17重要的新特性的简介。原文中有些地方写得不是很好理解所以对其做了少量修改
ZifengHuang
2020/07/29
3.1K0
【翻译】C++17的新特性简介
初识C++ · 模板进阶
前面模板我们会了简单的使用,这里带来模板的进阶,当然,也就那么几个知识点,并不太难。
_lazy
2024/10/16
980
初识C++ · 模板进阶
【C++】格式与实例化操作——[模板]详解(7)
YY的秘密代码小屋
2024/01/22
1460
【C++】格式与实例化操作——[模板]详解(7)
C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象
从C++标准产生一直到C++17,C++标准一直在试图减少某些临时变量或者拷贝的操作,虽然经过优化后,可能在实际执行中不需要调用拷贝或者移动构造,但是它必须隐士或者显示存在,如下面的案例,如果在类中禁止编译器默认生成拷贝构造和移动构造函数,代码将不会被编译通过。
CPP开发前沿
2022/04/13
1.4K0
C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象
C++17常用新特性(七)---新的属性和属性特性
C++17 增加了一些新的属性,这些属性并不是强制使用,但是正确使用后确实能够帮助我们避免一些问题,而这些问题恰恰是在做项目的时候容易忽略的,比较常见的一类问题是在前面把变量全部进行了定义,但是后面没有使用,还有一种是对于函数的返回值没有进行判断等,在本文中,将主要对C++17新增的一些属性进行解释和说明。
CPP开发前沿
2022/04/13
1.5K0
C++17常用新特性(七)---新的属性和属性特性
C++17 模板新特性详解:从新手到进阶
C++ 模板编程一直是 C++ 的强大特性之一,但它也以复杂性著称。幸运的是,C++17 引入了许多新的模板特性,这些特性不仅简化了模板编程,还提高了代码的可读性和灵活性。即使你是模板编程的新手,这些新特性也能帮助你更快上手,写出更优雅的代码。本文将详细介绍以下几个关键的模板新特性:
码事漫谈
2025/01/23
1690
C++17 模板新特性详解:从新手到进阶
C/C++开发基础——类模板
类模板是用来生成类的蓝图,是一种创建类的方式,同一套类模板可以生成很多种不同的类。
Coder-ZZ
2023/10/07
2260
C/C++开发基础——类模板
【c++】模板编程解密:C++中的特化、实例化和分离编译
非类型模板参数允许你将一个值(而不是一个类型)直接传递给一个模板。非类型模板参数可以是一个整型值、一个指针或者一个引用,因为这些参数不是类型,所以被称为“非类型模板参数”。
用户11029103
2024/05/04
7590
【c++】模板编程解密:C++中的特化、实例化和分离编译
C++17常用新特性(八)---其他不常用语言特性
C++17版本中,标准委员会同时对一些小的特性进行发布。在本文中,将对一些细小的特性进行梳理。欢迎批评指正。
CPP开发前沿
2022/04/13
7570
C++17常用新特性(八)---其他不常用语言特性
C++17 在业务代码中最好用的十个特性
作者:jinshang,腾讯 WXG 后台开发工程师 自从步入现代 C++时代开始,C++语言标准形成了三年一个版本的惯例:C++11 标志着现代 C++的开端,C++14 在 11 的基础上查缺补漏,并未加入许多新特性,而 C++17 作为 C++11 后的第一个大版本,标志着现代 C++逐渐走向成熟。WXG 编译器升级到 gcc7.5 已有一段时间,笔者所在项目组也已经将全部代码升级到 C++17。在使用了 C++17 一年多之后,笔者总结了 C++17 在业务代码中最好用的十个特性。 注 1:本文只
腾讯技术工程官方号
2022/05/25
2.8K0
C++17 在业务代码中最好用的十个特性
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
在模板编程中,除了类型参数(如 class T 或 typename T)外,还可以使用非类型模板参数。非类型模板参数可以是常量,例如整数、枚举、指针等,它们在编译期间是已知的值。
半截诗
2024/10/09
2050
C++中auto关键字的用法详解
在C语言中auto修饰的变量,是具有自动存储器的局部变量,但因为局部变量默认类别默认是auto修饰导致一直没有人去使用它。
薄荷冰
2024/04/30
4560
C++中auto关键字的用法详解
C++11特性:初始化列表、右值引用、可变模板
C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既 有实践,并改进了对 C++ 程序员可⽤的抽象。在它最终由 ISO 在 2011 年 8 ⽉ 12 ⽇采纳前,⼈们曾使 ⽤名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故⽽这 是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。
用户11375356
2025/02/11
1470
C++11特性:初始化列表、右值引用、可变模板
【C++】模板进阶
1. 模板参数分为类型模板参数和非类型模板参数,类型模板参数一般是class或typename定义出来的泛型,而非类型模板参数一般是整型定义出来的常量,这个常量作为类模板或函数模板的一个参数,在类模板或函数模板中可将该参数当成常量来使用。
举杯邀明月
2023/04/12
1.1K0
【C++】模板进阶
C++17中新特性
从c++11开始,auto关键字能够通过初始化器推导出变量的类型。在c++14中,auto关键字的能力进一步提升,能够通过return语句推导出函数的返回类型。
XZAN
2019/01/14
5K0
C++模板总结
模板(Template)指 C++ 程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如 STL 以及 IO Stream。模板是 C++ 支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
C语言与CPP编程
2021/12/10
1.3K0
C++模板总结
C++17常用新特性(六)---lambda表达式的扩展
从C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在的C++17 lambda的功能又进行了扩展。在C++17新特性中,主要支持了以下两种场景:
CPP开发前沿
2022/04/13
1K0
C++17常用新特性(六)---lambda表达式的扩展
全面盘点17个C++17的高级特性
C++17是目前比较常用的版本之一,今天花时间来梳理一下17个重要特性,所有的特性也不止这么点。
公众号guangcity
2024/03/22
3.8K0
全面盘点17个C++17的高级特性
【泛型编程】模板全详解
在c语言中,如果我们想写多类型的,并且是同一个函数出来的函数,我们只能要几个写几个出来,这样子会显得比较冗余,也加大了程序员的代码量,于是c++中就引入了函数重载和泛型编程的概念,大大的简化了我们的工作!
利刃大大
2023/04/12
7130
【泛型编程】模板全详解
推荐阅读
相关推荐
C++17常用新特性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验