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

18720

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

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

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

13710

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.7K30

CC++变参函数

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

1.1K10

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

51440

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

27650

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

61280

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.3K10

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),第二个参数为浮点行,模板参数

64530

【笔记】《深入理解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.8K20

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

C++特性使用建议

C 语言中,如果函数需要修改变量的值,参数必须为指针,如int foo(int *pval), C++ ,函数还可以声明引用参数int foo(int &val),定义引用参数防止出现 (*pval...编译器可以更好地进行类型检测,相应地,也能生成更好的代码。人们对编写正确的代码更加自信,因为他们知道所调用的函数被限定了能或不能修改变量值。即使是无锁的多线程编程,人们也知道什么样的函数是安全的。...C++11 ,若变量被声明成 auto,那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。...+11(前身是 C++0x)的库和语言扩展贵项目用 C++11 特性前三思可移植性。...和Boost 库 一样,有些 C++11 扩展提倡实则对可读性有害的编程实践——就像去除冗余检查(比如类型名)以帮助读者,或是鼓励模板元编程等等。

1.9K30

C++11 变参模板

1.概述 变参模板(variadic template)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型参数。.../3 3 sizeof…运算符的作用是计算参数参数个数,既可以作用于模板参数T,也可以作用于函数参数args。...展开参数的函数有两个,一个是递归函数,另外一个是递归终止函数,参数Args…展开的过程递归调用自己,每调用一次参数参数就会少一个,直到所有的参数都展开为止,当没有参数时,则调用非模板函数print...fun1 = Fun1;//编译报错,参数类型不匹配 这里不能泛化的原因是声明委托类型的时候就限定了参数类型和个数,C++11里不存在这个问题了,因为有了可变模版参数,它就代表了任意类型和个数的参数了...4.总结 使用变参模板能够简化代码,正确使用的关键是如何展开参数,展开参数的过程是很精妙的,体现了泛化之美、递归之美,正是因为它具有神奇的“魔力”,所以我们可以更泛化的去处理问题,比如用它来消除重复的模版定义

3.3K51

【笔记】C++2.0新特性

样例代码里面模板类型名后面的...称为模板参数(template parameters pack), 函数参数部分类型名后面的...称为函数模板类型(function template types...由于编译器无法模板推导模板参数正确形式, 也就是模板参数的默认值在编译阶段是无法展现的....和Lambda, 替代了旧版本不好用的typeof 返回值: 模板编程, 我们不仅希望能自动推导参数类型, 还希望按照得到的类型来推导返回值, 如今可以借助尾置返回模板函数写为下面的形式....尾置返回也是C++11新加入的特性, 其目的是让参数列表的符号也可以返回值推导中使用....尽管这里都是左值, 但是它们的声明类型依然是正确的, 我们想到可以利用转型来恢复它的引用属性 为了适配模板, 我们可以写出如下的模板函数. pass传入ref的参数只有int&和int&&两种类型, 且都是左值

86320

Modern c++快速浅析

将函数的返回值标记为auto,意味着返回类型的推导遵循模板类型推导的原则,而非auto的推导原则 C++11加入的_trailing return type_(尾返回类型),需要搭配decltype... func() { return {1, 2, 3}; } Lambda表达式推导 C++11,Lambda表达式的参数需要具体的类型声明 auto MyLambda = [](int...a, int b) { return a + b; }; auto用于Lambda表达式时,同样代表遵循模板类型推导的原则,例如C++11可以将其用于匿名函数参数的推导 // 使用auto接住匿名函数...,因此对于大括号初始物而言,参数还是返回值都无法正确的将其推导出来 Range-base-loop with auto 参考自知乎-蓝色-range-base-loop中使用auto 总结: •当你想要拷贝...int&,但是由于使用模板类型推导,返回值的类型将会是int,而在C++对右值进行赋值是非法的,因此会编译失败。

14410
领券