首页
学习
活动
专区
工具
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,也可能是刻意如此。

27820

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

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

1.1K31
  • C++11新关键字

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

    3.1K10

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

    我依稀记得这是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的结果类型将是什么。作为模板,它们甚至可以是非整数类型。

    23210

    可变参数模板

    C++11提供了可变参数模板语法,允许开发者编写参数数量不定的模板函数和模板类。 参数包的两种类型 可变参数模板中的参数被称为参数包(Parameter Pack)。...在C++11中,有两种参数包: 模板参数包:表示零或多个模板参数,使用 class... 或 typename... 关键字声明。 函数参数包:表示零或多个函数参数,使用类型名后跟 ... 表示。...它可以直接应用于模板参数包或函数参数包,返回参数包中包含的元素数量。...包扩展 在C++11中,可变参数模板不仅可以处理可变数量的参数,还支持对参数包进行“扩展”操作。包扩展允许我们分解参数包中的各个元素,并为每个元素应用某种模式,从而对其进行逐个处理。...包扩展的高级应用 C++11 支持更复杂的包扩展,可以直接将参数包依次展开,并作为实参传递给另一个函数。例如,假设我们有一个 GetArg 函数,用于处理单个参数,并将其返回。

    15510

    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.5K50

    c++中lambda表达式用法

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

    1.9K30

    C++11特性:初始化列表、右值引用、可变模板

    可变参数模板 4.1 基本语法及原理 C++11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板,可变数⽬的参数被称 为参数包,存在两种参数包:模板参数包,表⽰零或多个模板参数;函数参数包:...⽰⼀个包,在模板参数列表中,class...或 typename...指出接下来的参数表⽰零或多个类型列表;在函数参数列表中,类型名后⾯跟...指出 接下来表⽰零或多个形参对象列表;函数参数包可以⽤左值引...对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个 包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元 素应⽤模式,获得扩展后的列表...我们通过在模式的右边放⼀个省略号(...)来触发扩展操作。底层 的实现细节如图1所⽰。 C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。...传递参数包过程中,如果是 Args&&... args 的参数包,要⽤完美转发参数包,⽅式如下 std::forward(args)... ,否则编译时包扩展后右值引⽤变量表达式就变成了左值。

    8600

    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])表示函数返回值类型在函数参数后声明

    55340

    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信号量通过调用其对应的方法生成的新的信号量就是该尾随闭包的返回值。具体如下所示。

    64980

    C++ —— 剑斩旧我 破茧成蝶—C++11

    C++11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板,可变数⽬的参数被称为参数包,存在两种参数包:...函数参数包:表⽰零或多个函数参数 //Args:类型名称,随便写 //:模板参数包 //(Args... args):函数参数包 template 模板参数或函数参数的表⽰⼀个包 在模板参数列表中,class...或typename...指出接下来的参数表⽰零或多个类型列表 在函数参数列表中,类型名后⾯跟...指出接下来表⽰零或多个形参对象列表...对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供⽤于每个扩展元素的模式 扩展⼀个包就是将它分解为构成的元素,对每个元素应⽤模式,获得扩展后的列表...C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理 底层的实现细节: 包扩展的方式1: //包扩展的方式 void ShowList() { // 编译器时递归的终

    5500

    CC++变参函数

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

    1.2K10

    【深度剖析 C++11】 第三弹:C++11完结,迈进高效编程的新纪元

    C++11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数量的参数被称 为参数包,存在两种参数包:模板参数包,表示零或多个模板参数;函数参数包:表示零或多个函数参数。...⼀个包,在模板参数列表中,class...指出接下来的参数包表示零或多个类型;在函数参数列表中,类型名后面跟...指出接下来形参列表表示零或多个形参对象;函数参数包可以用左值引用或万能引用表示,跟前面普通模板...我们可以使用 sizeof 计算参数包中参数的个数: //Args为可变参数类型 ...表示为可变参数模板 args为参数包 template void Calculate...对于⼀个参数包,除了能计算它的参数个数,我们还可以扩展它,当扩展⼀个包时,我们还要提供用于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应用模式,获得扩展后的列表。...cout<< endl; } //实现包扩展的函数模板 template<class T,class ...

    9910

    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 中进行了重大改动,新增了 可变参数包,支持直接传入任意数量

    54450

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

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

    34710

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

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

    18010

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

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

    8410

    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++】C++11风云再起:语法新纪元,性能新巅峰!

    可变参数模板是C++11引入的一种强大的模板功能,允许模板**接受可变数量的模板参数,它为开发泛型代码提供了很大的灵活性,特别是在处理不同数量和类型的参数时。...是一个模板参数包,表示零个或者多个模板参数,其原理与模板类似,本质还是去实例化对应类型和不同参数个数的多个函数。 args... 是一个函数参数包,表示零个或者多个模板参数,可以用sizeof......运算符去计算参数包中参数的个数,也可以使用左值引用和右值引用,与普通模板一样。 语法示例: 计算函数参数包的个数。...这样,emplace 能够根据传入参数的具体类型(左值或右值)正确调用匹配的构造函数。...参数列表(parameters):函数参数,可以为空。 返回类型(-> return_type):指定返回值类型,一般省略。

    5810

    C++11新特性学习笔记

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

    2.1K20
    领券