• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 剖析C++中的常量表达式与省略号的相关作用

剖析C++中的常量表达式与省略号的相关作用

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++常量表达式,c++定义常量,c++常量,c++正则表达式,表达式求值c++等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++ 常量表达式
常量值是指不会更改的值。C + + 提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图。
C++ 需要常量表达式(计算结果为常量的表达式)以便声明:

  • 数组边界
  • case 语句中的选择器
  • 位域长度规范
  • 枚举初始值设定项

常量表达式中合法的唯一操作数是:

  • 文本
  • 枚举常量
  • 声明为使用常量表达式初始化的常量的值
  • sizeof 表达式

必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型。因此,以下代码是合法的:

const double Size = 11.0;
char chArray[(int)Size];
</div>

到整型的显式转换在常量表达式中是合法的;所有其他类型和派生类型是非法的(在用作 sizeof 运算符的操作数时除外)。
逗号运算符和赋值运算符不能用于常量表达式。

省略号和可变参数模板
省略号在 C 和 C++ 中具有许多用途。这些包括函数的变量参数列表。C 运行库的 printf() 函数是一种最常见的示例。
variadic 模板是支持任意数量的参数的类或函数模板。此机制对 C++ 库开发人员尤其有用,因为您可以将其应用于类模板和函数模板,从而提供一系列类型安全和重要功能以及灵活性。
语法
可变参数模板用两种方法使用省略号。参数名称的左侧表示参数包,参数名称的右侧将参数包扩展为单独的名称。
以下是可变参数模板类定义语法的基本示例:

template<typename... Arguments> class classname;
</div>

如以下示例所示,对于参数装箱和展开,可以根据您的喜好在省略号周围添加空白,例如:

template<typename ...Arguments> class classname;
</div>

或为:

template<typename ... Arguments> class classname;
</div>

请注意本文使用的是显示在第一个例子中约定(该省略号附加于typename).
在前面的示例中,Arguments 是参数包。类 classname 可以接受参数数目可变,例如以下示例:

template<typename... Arguments> class vtclass;

vtclass< > vtinstance1;
vtclass<int> vtinstance2;
vtclass<float, bool> vtinstance3;
vtclass<long, std::vector<int>, std::string> vtinstance4;

</div>

通过使用可变参数模板类定义,您还可以要求至少一个参数。

template <typename First, typename... Rest> class classname; 
</div>

以下是可变参数模板函数语法的基本示例:

template <typename... Arguments> returntype functionname(Arguments... args);
</div>

如下一节“了解可变参数模板”所示,Arguments 参数包展开使用。
variadic 模板函数语法还可能有其他形式,包括不限制于:

template <typename... Arguments> returntype functionname(Arguments&... args); 
template <typename... Arguments> returntype functionname(Arguments&&... args);
template <typename... Arguments> returntype functionname(Arguments*... args);
</div>

还允许使用类似 const 的说明符:

template <typename... Arguments> returntype functionname(const Arguments&... args); 
</div>

按照可变参数模板类的定义,您可以创建需要至少一个参数的函数:

template <typename First, typename... Rest> returntype functionname(const First& first, const Rest&... args);

</div>

可变模板使用 sizeof...() 运算符(与更早的 sizeof() 运算符不相关):

template<typename... Arguments>
void tfunc(const Arguments&... args)
{
  const unsigned numargs = sizeof...(Arguments);

  X xobj[numargs]; // array of some previously defined type X

  helper_func(xobj, args...);
}

</div>

更多有关省略号位置
过去,本文介绍了定义参数装箱和展开“在参数名称左侧的省略号位置,它表示参数,包,并在参数名称右侧,其展开参数装箱到单独的名称”。这是技术上为 true,但可能会费一番功夫在转换代码。请考虑:
模板参数列表(template <parameter-list>), typename... 介绍了模板参数包。
在参数声明语句(func(parameter-list)),“顶层”省略号介绍函数参数包,并且该省略号地位是很重要的

// v1 is NOT a function parameter pack:
template <typename... Types> void func1(std::vector<Types...> v1); 

// v2 IS a function parameter pack:
template <typename... Types> void func2(std::vector<Types>... v2); 

</div>

如果省略号在参数名之后出现,则具有参数 pack 展开。
一种阐明 variadic 模板功能框架的好方法是在 printf 一些功能的重新写入中使用:

#include <iostream>

using namespace std;

void print() {
  cout << endl;
}

template <typename T> void print(const T& t) {
  cout << t << endl;
}

template <typename First, typename... Rest> void print(const First& first, const Rest&... rest) {
  cout << first << ", ";
  print(rest...); // recursive call using pack expansion syntax
}

int main()
{
  print(); // calls first overload, outputting only a newline
  print(1); // calls second overload

  // these call the third overload, the variadic template, 
  // which uses recursion as needed.
  print(10, 20);
  print(100, 200, 300);
  print("first", 2, "third", 3.14159);
}

</div>

Output

1
10, 20
100, 200, 300
first, 2, third, 3.14159
</div>

注意
合并变参数模板函数的大多数实现使用某种形式的递归,但是它与传统递归稍有不同。传统递归涉及使用与函数相同的签名调用函数。(可以重载或模板化,但每次都要选择相同的签名。)可变递归使用不同(几乎总是减少)数目的参数调用可变函数模板,因此每次都抹去不同的签名。仍需要“基用例”,但是,递归性质是不同的。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 简单总结C++中指针常量与常量指针的区别
  • 详解C++中常量的类型与定义
  • 剖析C++中的常量表达式与省略号的相关作用
  • C++中的常量定义小结

相关文章

  • 2017-05-28新手小心:c语言中强符号与弱符号的使用
  • 2017-05-28关于STL中的map容器的一些总结
  • 2017-05-28C/C++实现快速排序的方法
  • 2017-05-28整理C语言中各种类型指针的特性与用法
  • 2017-05-28C++中的friend友元函数详细解析
  • 2017-05-28C++编程中new运算符的使用学习教程
  • 2017-05-28C语言 数据结构之链表实现代码
  • 2022-04-30C语言二维数组指针(指向二维数组的指针)详解
  • 2017-05-28C语言数据类型转换实例代码
  • 2017-05-28四叉树有损位图压缩处理程序示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 利用C++实现从std::string类型到bool型的转换
    • C/C++中static,const,inline三种关键字详细总结
    • c++基础语法:普通继承
    • 北邮考研复试C语言上机题目精选
    • C语言读取文件流的相关函数用法简介
    • YUV格式与RGB格式的相互转换公式及C++代码
    • 使用C++绘制GDI位图的基本编写实例
    • 基于C语言实现简单的走迷宫游戏
    • C++ decltype类型说明符
    • C++ 中"emplace_back" 与 "push_back" 的区别

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有