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
原创粉丝点击