首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无参数模板参数的自动检测

无参数模板参数的自动检测
EN

Stack Overflow用户
提问于 2014-06-24 07:41:27
回答 2查看 536关注 0票数 4

这是an answer对另一个SO post的一个分支。

我有下面的工作代码,具有预期的输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

template <typename T>
T twice(T in)
{
   return 2*in;
}

struct Foo
{
   Foo operator+(int (*func)(int in)) const
   {
      Foo ret{data};
      ret.data += func(ret.data);
      return ret;
   }
   int data;
};

int main()
{
   Foo f1{20};
   Foo f2 = f1 + twice;
   Foo f3 = f1 + twice<int>;
   std::cout << f2.data << std::endl;
   std::cout << f3.data << std::endl;
}

直到昨天,我才知道编译器可以在没有参数的情况下推断函数模板的类型参数。在上面的代码中,表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f1 + twice

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f1 + twice<int>

结果是相同的值。

我的问题是:在C++03/C++11标准中,我们可以为编译器的自动类型检测逻辑找到必要的支持文档吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-24 08:45:42

这与实际的c++11标准最接近,但我发现的草稿http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf仍然公开可用。

我相信模板参数的推导是在编写Foo f2 = f1 + twice;并将twice作为函数地址传递时完成的。twice作为函数的地址传递给operator+。我相信以下机制起作用:

14.8.2.2使用函数模板temp.deduct.funcaddr的地址推导模板参数的: 当获取重载函数(13.4)的地址时,模板参数可以从specified类型中推导出来。函数模板的函数类型和specifi编辑类型作为P和A的类型,并按14.8.2.5中的描述进行了推导。

因此,实际的模板演绎将根据funct的类型进行。我相信14.8.2.5的相关段落是1和2。

14.8.2.5从类型temp.deduct.type`推断模板参数: 1模板参数可以在多个双ff传入上下文中推导,但在每种情况下,都会将一种按模板参数(称为P )与实际类型(称为A)进行比较的类型,并尝试对fi和模板参数值(类型参数的类型、非类型参数的值或模板参数的模板)进行比较,在替换推导值(称为A)之后,使之与A兼容。 2在某些情况下,推导使用一组P和A类型,在另一些情况下,将有一组对应的类型P和A。对每一对P/A分别独立地进行类型推导,然后将推导出的模板参数值组合起来。如果不能对任何P/A对进行类型推导,或者对任何对进行推演会导致多个可能的推断值集,或者如果双ff传入法对产生双ff推导值,或者如果任何模板参数既没有推导也没有显式地说明fied,则模板参数推导失败。

基本上,您将twice作为指向operator+的指针传递,然后通过operator+中定义的函数类型推导模板参数。因此,您有一个实际的类型A,即int (*)(int in)和模板类型P of twice,它们与A匹配,只有int twice(int)适合。

我希望我把一切都做对了。

票数 3
EN

Stack Overflow用户

发布于 2014-06-24 08:44:30

C++11 14.8.2.2模板参数可以从使用重载函数的地址时指定的类型推导出来。

这里,operator+的参数类型指定的类型是int (*)(int),重载的函数是twice,因此int被推导为模板参数,从而给出匹配的函数类型。如果您需要扣减的血淋淋的细节,请参阅14.8.2.5。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24390911

复制
相关文章
@ComponentScan 无参数
在 Spring 中,我们使用 @ComponentScan 和 @Configuration 注解来指定希望扫描的 Package。
HoneyMoose
2020/04/15
4340
函数模板参数(函数参数在哪)
下面列举的几种情况不能省略模板实参: 1)从模板函数实参表获得的信息有矛盾之处。
全栈程序员站长
2022/07/26
3.1K0
函数模板参数(函数参数在哪)
VNFD模板参数化
VNFD参数化可以实现通过单个VNFD文件和不同的VDU的参数以及值进行多次部署。
后端云
2018/10/24
2.8K0
C语言有参数宏定义与无参数宏定义
前两天上课,被JAVA老师问懵了,老师问:“你们学C语言,有没有写过带参的宏玩一玩”,说实话,我根本没听过什么带参的宏,我只用过宏定义,所以我下来一定要找个时间把这“带参的宏搞懂”,于是就有了这篇文章。        C语言中宏定义分两种,无参的宏和有参的宏 1.无参数的宏        无参数宏定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值 //示例: #include <iostream> using name
mathor
2018/06/22
3K0
Redis—SpringCache(一)无参数使用
Spring Cache 是Spring – context-xxx.jar中提供的功能,可以结合EHCache,Redis等缓存工具使用。给用户提供非常方便的缓存处理,缓存基本判断等操作,可以直接使用注解实现。
全栈程序员站长
2021/04/07
5750
Python 无固定参数装饰器
Python 装饰器(fuctional decorators)是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌"原"函数的函数。
Wu_Candy
2022/07/04
3200
C++11函数模板的默认模板参数
函数模板与类模板在C++98一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以。从C++11开始,这个限制被解除了,即函数模板同样可以拥有默认模板参数。默认模板参数的用法与函数的默认参数类似,考察如下示例:
恋喵大鲤鱼
2018/12/27
2.4K0
【CTF竞赛】无参数RCE总结
在CTF竞赛过程中,我们时常会遇到一种类型的题,那就是无参数命令执行。接下来通过例题的形式针对无参数命令执行常见技巧和利用方式进行了总结。
安全小王子
2020/12/14
4.5K0
【CTF竞赛】无参数RCE总结
C/C++开发基础——可变参数与可变参数模板
1.如果可变参数的参数类型相同,可以使用标准库中的initializer_list。
Coder-ZZ
2023/09/04
7270
C/C++开发基础——可变参数与可变参数模板
非类型模板参数/模板的特化/模板的分离编译
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型(比如int*这种)的可能会得到一些错误的结果,需要特殊处理,比如下面的代码:
二肥是只大懒蓝猫
2023/03/30
1.2K0
非类型模板参数/模板的特化/模板的分离编译
django ListView 获取 url 中的参数及根据参数使用不同的模板
from django.views import generic class IndexView(generic.ListView): template_name = 'lw-index-noslider.html' # 默认加载该模板文件 context_object_name = "articles" # 是数据库搜索出来的结果存放的变量名字,用于模板循环显示 paginate_by = paginate_by # 设置分页中每一页的记录数目 model = A
卓越笔记
2023/02/18
3.4K0
C++11:可变参数模板实现print输出参数
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/51226657
10km
2019/05/25
2.5K0
模板参数中 class 和 typename 的区别
在一些简单使用上两者是可以相互替换的,也就是没区别,比如上面你给出的例子。但在有一些场景下是有区别不可替换的,比如,
ClearSeve
2022/02/11
1.5K0
【C++】非类型模板参数、模板特化、模板的分离编译、模板总结
模板参数分类类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
平凡的人1
2023/10/15
2930
【C++】非类型模板参数、模板特化、模板的分离编译、模板总结
Vue3模板语法--动态参数
这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的组件实例有一个 data property attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href。
软件架构师Michael
2022/08/30
1.1K0
动态调用类中的方法(无)(有)参数
1、Type类,方法用Invoke调用的时候就 使用null:表示该方法是无参数的
静心物语313
2020/03/24
2.6K0
c++11模板:获取函数的参数类型
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/87891028
10km
2019/05/25
4.3K0
Kotlin入门(25)共享参数模板
共享参数SharedPreferences是Android最简单的数据存储方式,常用于存取“Key-Value”键值对数据。在使用共享参数之前,要先调用getSharedPreferences方法声明文件名与操作模式,示例代码如下:
aqi00
2019/01/18
8960
从mybatis sql模板中获取参数信息
最近在尝试从mybatis sql模板中获取参数信息,期间学习了mybatis内部的一些结构,接下来笔者就向大家分享mybatis相关知识和具体代码实现。
zhangheng
2021/01/12
7.9K0
从mybatis sql模板中获取参数信息
c++模板学习08之类模板对象做函数参数
#include<iostream> #include<string> using namespace std; //类模板对象做函数参数 template<class T1,class T2> class Person { public: Person(T1 name, T2 age) :name(name),age(age){} T1 name; T2 age; void showPerson() { cout << "姓名: " << name << " 年龄:" << age <<
大忽悠爱学习
2021/03/02
6240

相似问题

C++自动检测模板参数?

291

无参数函数、类和模板

20

无脂模板路由中的动态参数

15

参数上的模糊重载-无变量模板

21

模板->模板参数中的默认参数涉及模板参数。

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文