当前位置:网站首页>enable_if
enable_if
2022-06-27 13:17:00 【发如雪-ty】
一、enable_if 的定义
enable_if 是c++11标准引入的一个类模板,它的使用体现了c++编译器的SFINAE特性。对于没有使用过enable_if的同学来说,可能会显得有点突兀,下面先来一个例子。
template<typename T>
struct MEB
{
using type = T;
}
接着在main中如下使用:
MEB<int>::type abc = 15;
不难看到MEB::type 代表的就是int 类型。在理解了上面的例子后,接下来看看enable_if的实现源码,源码非常简单,如下:
template<bool _Test,class _Ty = void>
struct enable_if {
};
template<class _Ty>
struct enable_if<true,_Ty>
{
using type = _Ty;
}
上述代码中定义了一个enbale_if类模板,其中_Test为非类型模板参数,_Ty为类型模板参数;接着实现了一个enable_if的偏特化版本,第一个参数设置为true.其实这个偏特化可以理解为一种条件分支语句,如enable_if类模板,当其第一个模板参数为true的时候,对应的分支就是偏特化版本的分支,反之就是泛化版本的分支。
二、enable_if的使用
在mian中添加如下代码:
std::enable_if< (3>2) >::type *myptr = nullptr;
编译一下,没有语法错误。因为该表达式的结果为true,走了偏特化的版本,第二个模板参数没有在程序中提供,就走了模板参数的默认值,void类型,所以上面的代码等价于:
void *myptr = nullptr;
但是如果改为如下的代码:
std::enable_if< (3<2) >::type *myptr = nullptr;
编译就如下提示:
这是由于走了泛化版本,这个版本中根本没有type这个类型别名。
ebable_if用于函数模板中:
有如下例子:
template<typename T>
typename std::enable_if<(sizeof(T) > 2) >::type funceb()
{
//...
}
现在在main中如下调用:
funceb<int>();
编译后发现没有错误,因为sizeof(int)>2.也就是将这个函数模板被实例化为:
void funceb()
{
//...
}
那如果如下调用,便会出错
funceb<char> ();
这是由于sizeof(char)<2,不满足条件,也没有找到其他合适的函数,所以会报错。
c++14标准对enable_if的用法做了简化,只需要在其后面增加一个_t,就可以省略typename和::type的输入,如下修改:
template<typename T>
typename std::enable_if_t<(sizeof(T) > 2) > funceb()
{
}
现在试想,如果给函数模板funceb()中的enable_if_t提供第二个模板参数,也就是
template<typename T>
std::enable_if_t<(sizeof(T) > 2), T > funceb()
{
}
那么当遇到funceb();会被实例化为:
int funceb()
{
//...
}
这显然需要一个返回值嘛,
于是修改为:
template<typename T>
std::enable_if_t<(sizeof(T) > 2), T > funceb()
{
T t = {
};
return t;
}
int main()
{
int c = funceb<int>();
cout << c << endl;
system("pause");
return 0;
}
结果:
边栏推荐
猜你喜欢
【周赛复盘】LeetCode第81场双周赛
High efficiency exponentiation
Full explanation of ThreadLocal source code (threadlocalmap)
Half find (half find)
Implementation of recruitment website based on SSM
How to choose LAN instant messaging software
基于SSM实现招聘网站
Journal quotidien des questions (6)
Quick news: Huawei launched the Hongmeng developer competition; Tencent conference released the "Wanshi Ruyi" plan
快讯:华为启动鸿蒙开发者大赛;腾讯会议发布“万室如意”计划
随机推荐
After the deployment is created, the pod problem handling cannot be created
Yyds dry goods inventory solution sword finger offer: cut rope (advanced version)
硬件开发笔记(七): 硬件开发基本流程,制作一个USB转RS232的模块(六):创建0603封装并关联原理图元器件
《预训练周刊》第51期:重构预训练、零样本自动微调、一键调用OPT
What is low code for digital Nova? What is no code
同花顺能开户炒股吗?安全吗?
一次性彻底解决 Web 工程中文乱码问题
AGCO AI frontier promotion (6.27)
高效率取幂运算
每日刷题记录 (六)
Istio微服务治理网格流量管理核心资源控制器详解
On the complexity of software development and the way to improve its efficiency
IJCAI 2022 | greatly improve the effect of zero sample learning method with one line of code. Nanjing Institute of Technology & Oxford proposed the plug and play classifier module
GCC compiling dynamic and static libraries
JVM performance tuning and monitoring tools -- JPS, jstack, jmap, jhat, jstat, hprof
Shell 简明教程
快速搭建一个自己的访问国外网站,搭建ss并开启bbr快速上网
How to modify a node_ Files in modules
关于接口测试自动化的总结与思考
jvm 参数设置与分析