SFINAE使用
来源:互联网 发布:淘宝怎么样才不算盗图 编辑:程序博客网 时间:2024/05/17 21:47
什么是SFINAE
在C++中有很多的编程技巧(Trick),SFINAE就是其中一种,他的全义可以翻译为“匹配失败并不是一个错误(Substitution failure is not an error)”。简单来说他就是专门利用编译器匹配失败的一种技巧。
案例
比如我们想实现一个通用的函数叫AnyToString,他可以实现任意类型的数据转成字符串:
1
2
template
<
typename
ValueType>
char
* AnyToString(
const
ValueType& value);
我们更希望这个函数能检查ValueType类型自己有没有ToString方法,如果有就直接调用,没有的话就采取通用的处理方案。但是C++没有反射机制,不能像C#那样通过TypeInfo来检查,更没有像Java那样纯粹的OOP,从最基类就定义了ToString方法,下面的子类只用负责重载。
所以我们希望能有一种方法能让C++也能检查某个类型是否定义了某个成员函数,这就可以用到SFINAE。
解决方案
C++的模板匹配有个特点,编译器始终会寻找类型匹配最精确的模板。当然并不一定所有的模板都能匹配,一旦有某个模板匹配不成功,编译器会自动尝试别的候选模板。要是所有的都不成功那编译器就匹配失败。有的时候我们想故意跳过某些精确度高模板匹配,而使用精确度低的模板,这个时候就可以利用SFINAE故意让编译器匹配失败。
具体案例参考:
http://www.360doc.com/content/13/0509/16/9200790_284169409.shtml
http://www.360doc.com/content/13/0509/16/9200790_284173888.shtml
0 0
- SFINAE使用
- SFINAE
- SFINAE
- result_of SFINAE
- 深入浅出SFINAE
- 深入浅出SFINAE
- SFINAE应用一
- SFINAE应用二
- SFINAE应用三
- SFINAE 极简介绍
- C++中的SFINAE
- C++中的SFINAE
- c++模板之SFINAE
- boost::enable_if与SFINAE原则
- C++惯用法之SFINAE
- C++模板之SFINAE技术
- 由is_base_of看C++中的SFINAE
- C++ 重载决议overload resolution 与 SFINAE
- JDK支持的字符集
- Ubuntu 关机、重启、注销 命令
- 基于数组和链表的队列实现
- unity 打包资源及网络请求资源包
- 企鹅的封包拦截器, 只是技术研究爱好
- SFINAE使用
- C++ 内联inline
- QT中文显示问题
- Unity中物体的遮挡和显隐效果
- Cocos2d-x3.0 不规则Button
- 行转列
- 背包问题 nyoj106
- javascript转换日期格式
- 黑马程序员——关于Set,List,Map集合的简单总结