当前位置:网站首页>declval(指导函数返回值范例)
declval(指导函数返回值范例)
2022-07-06 10:05:00 【发如雪-ty】
有如下大代码:
int myfunc(int a, int b)
{
return a + b;
}
template<typename T_F,typename...U_Args>
decltype(declval<T_F>() (declval<U_Args>()...)) testImpl(T_F func, U_Args...args)
{
return func(args...);
}
int main()
{
int nSum = testImpl(myfunc, 13, 15);
cout << nSum << endl;
system("pause");
return 0;
}
运行结果:
我们都知道函数类型是由返回值类型和参数类型决定的,与函数名没有关系,所以这里的myfunc的函数类型为int(int,int),前面的代表的是返回值类型,括号中的是两个参数类型。
上述代码有一段推导函数模板返回值类型的代码比较有意思。从main函数中可以看到,testImpl并没有指定模板参数,所以模板参数是由编译器推断的。下面将推断类型做一个简单的解释。
(1)T_F被推断为int(*)(int,int)
(2)U_Args代表一包类型,传入的是5,8,所以会被推导为int,int.
(3)值得注意的是decltype(declval<T_F>() (declval<U_Args>()...))
,这种写法,我第一次接触的时候有点不习惯,但只要搞清楚它的作用就行了:根据函数类型以及参数类型推导出函数的返回值类型。
其实,这里还有一种不使用std::declval也能实现同样功能的写法-返回类型后置。实现起来要比std::declval清爽很多。
template<typename T_F, typename...U_Args>
template<typename T_F, typename...U_Args>
auto testImpl_2(T_F func, U_Args...args)->decltype(func(args...))
{
return func(args...);
}
int main()
{
int nSum = testImpl_2(myfunc, 13, 15);
cout << nSum << endl;
system("pause");
return 0;
}
结果:28
可能有的同学,会去掉->decltype(func(args...))
,因为这样也能得到正确的答案,但这不是一个好主意,testImpl_2的本意是希望返回的类型与第一个类型模板参数T_F所代表的类型(既myfunc()函数返回类型)完全一样,而这正是“->decltype(func(args…))”代码存在的意义。
边栏推荐
- C # nanoframework lighting and key esp32
- Wechat applet obtains mobile number
- 偷窃他人漏洞报告变卖成副业,漏洞赏金平台出“内鬼”
- Alibaba brand data bank: introduction to the most complete data bank
- Compile and build, from the bottom to the top
- 【Android】Kotlin代码编写规范化文档
- Pourquoi Li shufu a - t - il construit son téléphone portable?
- Pyspark operator processing spatial data full parsing (5): how to use spatial operation interface in pyspark
- Nodejs 开发者路线图 2022 零基础学习指南
- 李書福為何要親自掛帥造手機?
猜你喜欢
JMeter interface test response data garbled
编译原理——自上而下分析与递归下降分析构造(笔记)
Interview assault 63: how to remove duplication in MySQL?
BearPi-HM_ Nano development environment
2022年大厂Android面试题汇总(二)(含答案)
Optimization of middle alignment of loading style of device player in easycvr electronic map
Summary of Android interview questions of Dachang in 2022 (I) (including answers)
The easycvr platform reports an error "ID cannot be empty" through the interface editing channel. What is the reason?
How to solve the error "press any to exit" when deploying multiple easycvr on one server?
The easycvr authorization expiration page cannot be logged in. How to solve it?
随机推荐
PyTorch 提取中间层特征?
Jerry's watch reading setting status [chapter]
Olivetin can safely run shell commands on Web pages (Part 1)
Nodejs developer roadmap 2022 zero foundation Learning Guide
Compile and build, from the bottom to the top
The art of Engineering (1): try to package things that do not need to be exposed
Interview shock 62: what are the precautions for group by?
Pytest learning ----- pytest confitest of interface automation test Py file details
酷雷曼多种AI数字人形象,打造科技感VR虚拟展厅
Appium automated test scroll and drag_ and_ Drop slides according to element position
After entering Alibaba for the interview and returning with a salary of 35K, I summarized an interview question of Alibaba test engineer
Summary of Android interview questions of Dachang in 2022 (II) (including answers)
What is the reason why the video cannot be played normally after the easycvr access device turns on the audio?
[elastic] elastic lacks xpack and cannot create template unknown setting index lifecycle. name index. lifecycle. rollover_ alias
Kill -9 system call used by PID to kill process
8位MCU跑RTOS有没有意义?
Solution qui ne peut pas être retournée après la mise à jour du navigateur Web flutter
JMeter interface test response data garbled
RepPoints:可形变卷积的进阶
Essai de pénétration du Code à distance - essai du module b