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

C++11:在尾随返回类型中正确扩展模板参数包

C++11引入了尾随返回类型(trailing return types)的特性,它允许在函数声明的尾部指定返回类型。在使用模板参数包(template parameter pack)时,可以通过尾随返回类型来正确扩展模板参数包。

尾随返回类型的语法形式为auto,后跟一个箭头->,然后是返回类型的表达式。在使用模板参数包时,可以使用decltype关键字结合尾随返回类型来推导返回类型。

下面是一个示例代码:

代码语言:txt
复制
template<typename... Args>
auto myFunction(Args... args) -> decltype(doSomething(args...)) {
    // 函数体
}

在上述示例中,myFunction是一个模板函数,它接受任意数量的参数包Args...。使用decltype和尾随返回类型,推导出返回类型为doSomething(args...)的表达式的类型。

尾随返回类型的优势在于可以更清晰地表达函数的返回类型,特别是在使用模板参数包时。它可以避免在函数声明之前使用参数包,使代码更加简洁和易读。

关于C++11的尾随返回类型和模板参数包的更多信息,可以参考以下链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

项目文件 MSBuild NuGet 编写扩展编译的时候,正确使用 props 文件和 targets 文件

.NET 扩展编译用的文件有 .props 文件和 .targets 文件。不给我选择还好,给了我选择之后我应该使用哪个文件来编写扩展编译的代码呢?...工具 - walterlv 如何创建一个基于命令行工具的跨平台的 NuGet 工具 - walterlv 当我们创建的 NuGet 包含 .props 和 .targets 文件的时候,我们相当于项目文件...Project> 于是,什么代码写到 .props 里而什么代码写到 .targets 里就一目了然了: 如果你是定义属性或者为属性设置初值,那么请写到 .props 里面 这样,所有的 NuGet 或者扩展的编译流程都将可以访问到你设置的属性的值...-- 当生成 WPF 临时项目时,不会自动 Import NuGet 的 props 和 targets 文件,这使得临时项目中你现在看到的整个文件都不会参与编译。...WPF 临时项目不会 Import NuGet 的 props 和 targets 可能是 WPF 的 Bug,也可能是刻意如此。

23720

【笔记】《深入理解C++11》(下)

模板类型后面的三个点...称为模板参数, 模板参数也可以是特化的 推导后的模板参数再通过参数名称后的三个点...来进行解包(扩展) 变长模板自然也可以用在函数模板, 称为函数参数....注意函数参数必须是函数的最后一个参数(模板参数没有这个要求) 模板参数可以以下七个位置展开, 但是不用太关注, 这些展开位置基本覆盖常见需求: 表达式 初始化列表 基类描述列表 类成员初始化列表...模板参数列表 通用属性列表 lambda捕捉列表 理解包扩展的核心是谨记其将...前面的直接成员进行多次使用 C++11还引入了sizeof...()操作符来计算参数参数数量, 返回一个size_t...// 变长右值引用 // 牢记...的本质是...参数列表中进行了展开, 前面的类型进行了多次的扩展出现 template<typename......为了保证线程的程序运行既能发挥优化的高效率又能拥有正确的顺序, C++11对底层硬件抽象出了一系列枚举值, 这些枚举值称为C++的内存模型 C++11, 原子类型变量本身已经满足多线程的同步特性,

1.1K30

C++11新关键字

1.auto auto是旧关键字,C++11之前,auto用来声明自动变量,表明变量存储栈,很少使用。C++11被赋予了新的含义和作用,用于类型推断。...auto不能用来声明函数的返回值。但如果函数有一个尾随返回类型时,auto是可以出现在函数声明返回值位置。...5.constexpr 5.1简介 constexprC++11用于申明常量表达式(const expression),可作用于函数返回值、函数参数、数据申明以及类的构造函数等。...8.sizeof…运算符 sizeof…运算符的作用是获取C++11可变参数模板参数中元素个数。...(3)模板特例化,也可以用 delete 来过滤一些特定的形参类型。例如,Widget 类声明了一个函数模板,当进行模板特化时,要求禁止参数为 void* 的函数调用。

3K10

不懂就问,函数声明后的“ - >”是什么语法?

我依稀记得这是c++11的一个新语法,回看了下《C++ Primer 5th》后给出了自己的回答,分享一下自己昨天的回答。 这是来自C++ 11的新函数声明语法,它被称为“尾随返回类型”。...函数声明结束时,->表示以下是该函数的返回类型。只有使用auto关键字而不是您通常期望的实际返回类型时才能使用它。...,当函数的返回类型可能随参数而变化时。...说你想要一个模板函数添加变量: template T add(const T& x, const T& y) { return x + y; } 你只能添加相同类型的变量...add(const T& x, const U& y) { return x + y; } 问题是你不能事先告诉x + y的结果类型将是什么。作为模板,它们甚至可以是非整数类型

17810

C++11——引入的新关键字

1.auto auto是旧关键字,C++11之前,auto用来声明自动变量,表明变量存储栈,很少使用。C++11被赋予了新的含义和作用,用于类型推断。...auto不能用来声明函数的返回值。但如果函数有一个尾随返回类型时,auto是可以出现在函数声明返回值位置。...这种情况下,auto并不是告诉编译器去推断返回类型,而是指引编译器去函数的末端寻找返回类型。在下面这个例子,函数返回类型是operator+操作符作用在T、U类型变量上的返回类型。...7.sizeof…运算符 sizeof…运算符的作用是获取C++11可变参数模板参数中元素个数。类似sizeof,sizeof…返回一个常量表达式,而且不会对模板的实参求值[7]^{[7]}。...(3)模板特例化,也可以用 delete 来过滤一些特定的形参类型。例如,Widget 类声明了一个函数模板,当进行模板特化时,要求禁止参数为 void* 的函数调用。

1.4K50

c++lambda表达式用法

本篇文章讲解c++11lambda表达式用法。 初次接触lambda这个关键字,记得还是python里面,但其实,早在2011年c++11推出来的时候我们c++就有了这个关键字啦。...所谓函数对象,其实就是对operator()进行重载进而产生的一种行为,比如,我们可以,重载函数调用运算符(),此时类对象就可以直接类似函数一样,直接使用()来传递参数,这种行为就叫做函数对象,同样的...如果需要参数,那么就要像函数那样,放在圆括号里面,如果有返回值,返回类型则要放在->后面,也就是尾随返回类型,当然你也可以忽略返回类型,lambda会帮你自动推导出返回类型,下面看一个较为复杂的例子:...2.3 展开方式捕获 仔细看2.2节捕获类型,会发现有[x…]这样的类型,它实际上是以复制方式捕获了一个可变参数c++其实涉及到了模板形参,也就是变参模板,看下面例子: #include <...比如在STL算法,经常要给一些模板类或者模板函数来指定某个模板参数为lambda表达式,就想上一节说的,我想统计999个员工工号是8的整数倍的员工个数,一个可用的代码如下: #include <iostream

1.8K30

CC++变参函数

可变参数模板示例: 使用省略号…来指明一个模板参数模板参数列表,class...或typename...指出接下来的参数表示零个或多个类型参数;一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数...//use like this 其中第一条示例Types就是模板参数,第二条示例rest就是函数参数,第三条示例args就是非类型模板参数。...参数扩展: 现在我们知道parameter packet了,怎么程序真正具体地去处理打包进来的“任意个数”的参数呢?...也就是说可变参数模板,我们如何进行参数扩展,获取传入的参数的每一个实参呢?...存在两种扩展操作: (1)const Types&... rest表示模板参数扩展,为print函数生成形参列表; (2)对print的调用rest...表示函数参数扩展,为print

1.1K10

C++一分钟之-可变模板参数模板模板参数

C++模板是实现泛型编程的强大工具。它们允许我们编写可以处理多种数据类型的代码,从而提高代码的复用性和灵活性。随着C++11的引入,可变模板参数模板模板参数进一步增强了模板的表达力和通用性。...可变模板参数 可变模板参数允许我们模板声明一个可以接受任意数量同类型或不同类型参数模板参数。这在实现如元组、函数参数类型列表等功能时非常有用。...常见问题与易错点 忘记展开参数模板函数内部,如果不使用...来展开参数,编译器将无法理解如何处理这些参数。...递归调用参数处理:递归调用模板函数时,正确地传递和处理参数是关键,否则可能导致无限递归或参数丢失。 如何避免 确保模板函数内部正确使用operator,...来展开参数。...递归调用,使用条件语句或辅助函数来正确处理参数的传递和终止条件。 代码示例 #include template<typename...

17710

C++一分钟之-可变模板参数模板模板参数

C++模板是实现泛型编程的强大工具。它们允许我们编写可以处理多种数据类型的代码,从而提高代码的复用性和灵活性。随着C++11的引入,可变模板参数模板模板参数进一步增强了模板的表达力和通用性。...可变模板参数 可变模板参数允许我们模板声明一个可以接受任意数量同类型或不同类型参数模板参数。这在实现如元组、函数参数类型列表等功能时非常有用。...常见问题与易错点 忘记展开参数模板函数内部,如果不使用...来展开参数,编译器将无法理解如何处理这些参数。...递归调用参数处理:递归调用模板函数时,正确地传递和处理参数是关键,否则可能导致无限递归或参数丢失。 如何避免 确保模板函数内部正确使用operator,...来展开参数。...递归调用,使用条件语句或辅助函数来正确处理参数的传递和终止条件。 代码示例 #include template<typename...

16110

C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板

2.1.模板的万能引用 泛型编程 的核心在于 模板根据参数类型推导函数,当我们分别传入 左值引用、右值引用 时,模板 是否能正确推导呢 下面这段代码的含义是 分别传入 左值、const 左值、右值、...,可以将函数参数类型写为 T&&,因为模板具有自动推导的特性,当传入的参数为 左值 时,触发 引用折叠 机制,实际参数类型会变为 T&;当传入的参数为 右值 时,正常使用 T&& 就行了 这一机制模板称为...,需要指定模板参数类型 T,确保能正确推导并传递 2.2.完美转发实际应用 完美转发 实际开发中会经常用到,前面说过, C++11 之后,所有的类都可以新增一个 移动构造 以规避无意义的低效拷贝行为...C++11 引入了 可变参数模板 和 可变参数 的特性,允许定义和使用可接受任意数量参数模板函数,这对于编写泛型代码、容器等方面提供了更大的灵活性 4.1.可变参数列表 C 语言就已经出现了...,但还得提前确定这些参数类型,使用起来比较麻烦 4.2.可变参数 C++11 之前只能像 C语言 那样使用固定参数的 可变参数列表, C++11 中进行了重大改动,新增了 可变参数,支持直接传入任意数量

38450

c++11类型推导

+11 新特性:decltype 模板类型推导 函数模板可以看成是这样: template void f(ParamType param); ParamType param =...char[13] param: const char (&)[13] 函数参数 函数类型退化成函数指针: void someFunc(int, double); //void (int, double...auto类型推导和模板类型推导基本一致,auto相当于T,只有一个例外:{} auto x1 = 27; //auto: int auto x2(27); //auto:...然而,对于一个比变量名更复杂的左值表达式, decltype 保证返回类型是左值引用 int x = 0; decltype(x) a; //a: int decltype((x)) a;...//a: int & 尾随返回类型 //c++11版本 //auto作为函数返回值,不能推导出c和i的类型,因为这时候c和i还没有声明 //通过--> decltype(c[i])表示函数返回类型函数参数后声明

53640

ReactiveSwift源码解析(九) SignalProducerProtocol延展的Start、Lift系列方法的代码实现

MyClassProducer也有一个add方法,只不过该add方法接收的是一个闭参数,而返回值是一个MyClass类型。...add()的尾随参数是MyClass类型的对象myclass1,其返回值是(MyClass)->MyClass类型的闭,所以我们就直接在尾随返回了一个闭块,该返回的闭块的类型就是(MyClass...然后(MyClass)->MyClass类型的闭返回了一个MyClass类型的对象,创建该对象时,使用到了上述两个闭参数myclass1和myclass2。...下方代码lift()方法的尾随就是上述函数实现的transform的闭体。下方的signal参数就是transform调用时传入的参数。...其中的$0参数就是尾随的Signal参数,$0信号量通过调用其对应的方法生成的新的信号量就是该尾随返回值。具体如下所示。

63580

C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘

可变参数模板 可变参数模板C++11引入的一种非常有用的语言特性,它允许函数或类模板接受可变数量的参数。...这一特性极大地增加了模板的灵活性和扩展性,使得开发者可以定义更加通用和灵活的函数或类模板 C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版只能含固定数量的模版参数...,这个参数可以包含0到任意个模板参数。...该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量 注意:lambda函数定义参数列表和返回类型都是可选部分,而捕捉列表和函数体可以为 空。...因此C++11最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情 int main() { // 省略了返回类型,无返回类型 auto f2 = [](int* x,

7010

C++11新特性学习笔记

C++11 ,它可以自动推导出更复杂的类型,包括带类型指针、带有默认构造函数的对象类型等。此外,auto 还可以用作迭代器的类型推导,以及泛型编程时的模板类型推导。...返回类型后置:函数名和参数列表后面指定返回类型。...C++11标准,要求编译器对模板的右尖括号做单独处理,使编译器能够正确判断出”>>”是一个右移操作符还是模板参数表的结束标记。...可变参数模板 C++11之前,类模板和函数模板只能含有固定数量的模板参数C++11增强了模板功能,允许模板定义包含0到任意个模板参数,这就是可变参数模板。...(2, 1.0); // OK:args含有两个实参int和double 省略号“…”的作用有两个: \1) 声明一个参数,这个参数可以包含0到任意个模板参数 \2) 模板定义的右边,可以将参数展开成一个一个独立的参数

2.2K20

C++11新特性学习笔记

C++11 ,它可以自动推导出更复杂的类型,包括带类型指针、带有默认构造函数的对象类型等。此外,auto 还可以用作迭代器的类型推导,以及泛型编程时的模板类型推导。...返回类型后置:函数名和参数列表后面指定返回类型。...C++11标准,要求编译器对模板的右尖括号做单独处理,使编译器能够正确判断出”>>”是一个右移操作符还是模板参数表的结束标记。...可变参数模板 C++11之前,类模板和函数模板只能含有固定数量的模板参数C++11增强了模板功能,允许模板定义包含0到任意个模板参数,这就是可变参数模板。...(2, 1.0); // OK:args含有两个实参int和double 省略号“…”的作用有两个: \1) 声明一个参数,这个参数可以包含0到任意个模板参数 \2) 模板定义的右边,可以将参数展开成一个一个独立的参数

2K20

【C++】C++11 新特性

、智能指针、标准线程库等 C++14 对C++11扩展,主要是修复C++11漏洞以及改进,比如:泛型的lambda表达式,auto的返回类型推导,二进制字面常量等 C++17 C++11上做了一些小幅改进...C语言有一些不同,下面是一个基本可变参数的函数模板: // Args是一个模板参数,args是一个函数形参参数 // 声明一个参数Args...args,这个参数可以包含0到任意个模板参数。...“参数”,它里面包含了0到N(N>=0)个模版参数参数参数的个数 可变参数的函数模板我们可以使用 sizeof…(args) 来求得参数参数的个数: 2、取出参数的每个参数 既然可以使用...注意: lambda 函数定义参数列表和返回类型都是可选部分,即可以省略不写,同时捕捉列表和函数体也可以为空,因此 C++11 中最简单的 lambda 函数为:[]{}; 但该 lambda... C++11 标准引入了 std::function 模板类,其定义 头文件

1.4K10

【笔记】《深入理解C++11》(上)

, POD 库编程: 内联命名空间, 继承构造, 右值引用 C++11标准的设计准则: 稳定性和兼容性之间抉择: auto, using, nullptr 用库而非扩展语言语法来实现特性: std::...但是如要注意模板实际参数始终都以实际类型优先, double和int是这个特性的常见例子, 例如1, 如果默认参数是double就会被推导为double C++11引入了extern模板....语法扩展 函数前面加上explict可以防止参数发生隐式类型转换, 用于构造函数和operator 不要将explict与delete共用, 因为这相当于删去了显式转换版本的函数, 可能会留下默认的隐式转换的实现...大括号初始化会制止类型收窄 大括号的返回值是initializer_list, 可以用作函数的一种重载参数 大括号也可以return, 一般用来构造临时变量, 具体构造出来的临时变量还是依靠声明的返回值决定...C++11给typeinfo新加入了hash_code()这个函数可以返回类型唯一的哈希值 decltype也是编译期的类型推导, 但是其从一个表达式作为参数返回该表达式的类型 有了decltype后,

1.9K20

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

需要写成如下格式:Foo >;C++11之后,这种限制已经被取消,编译器已经能够做出正确判断并进行编译。...二、模板的别名 C98,可以使用typedef重定义一个类型,如: typedef unsigned int uint_t; 在上面的代码无符号整型类型被重新定义,但并不是新增一种类型,只是给已存在的类型重新定义了一个别名...三、函数模板的默认模板参数 C98,类模板可以有默认模板参数,函数模板的默认模板参数是不被支持的,这一限制,C++11得到了解除。...,函数的返回值将返回的是指定参数类型。...通过identity禁用了val的自动推导,但因为指定了默认参数模板类型,因此,func(123),func的val参数将为int整型,func(123,123.0),第二个参数为浮点行,模板参数

66130

【C++】————C++11

可变参数模板C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。...// Args是一个模板参数,args是一个函数形参参数 // 声明一个参数Args...args,这个参数可以包含0到任意个模板参数。...使用该修饰符时,参数列表不可省略(即使参数为空)。 ->returntype:返回类型。用追踪返回类型形式声明函数的返回类型,没有返回值时此部分可省略。...返回类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。...lambda函数定义参数列表和返回类型都是可省略部分,而捕捉列表和函数体可以为空。因此C++11最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。

4810

Swift之闭

这就是所谓的闭合并包裹着这些常量和变量,俗称闭。Swift 会为您管理捕获过程涉及到的所有内存操作。...Swift 的闭表达式拥有简洁的风格,并鼓励常见场景中进行语法优化,主要优化如下: 利用上下文推断参数返回类型 隐式返回单表达式闭,即单表达式闭可以省略return关键字 参数名称缩写 尾随...因为所有的类型都可以被正确推断,返回箭头 (->) 和围绕在参数周围的括号也可以被省略: var reversed = sorted(names, { s1, s2 in return s1 > s2...: var reversed = sorted(names, { s1, s2 in s1 > s2 }) 在这个例子,sort函数的第二个参数函数类型明确了闭必须返回一个Bool类型值。...在上例作为sort函数参数的字符串排序闭可以改写为: var reversed = sorted(names) { $0 > $1 } 当闭非常长以至于不能在一行中进行书写时,尾随变得非常有用

1.7K10
领券