注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

SFINAE原理及其在模板中的使用之二具体的使用  

2014-07-04 15:08:45|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

SFINAE原理及其在模板中的使用之二具体的使用

在上一篇博文中初步讲了一下SFINAE的基本原理,所以不得不承认,大老外在这方面确实是比国内的水平要高很多,从一些细节就可以看得出来。

自己写了一个宏,来处理成员变量和函数的检测,这个在模板函数里很重要,在接口的入参检测里可以大显身手。看下面的代码,很简单:

#define CHECK_MEMBER_MEMNAME(name) char check_property_##name(...);\

         template<typename T>\

         auto check_property_##name(T const& t, decltype(&(t.##name)) p = 0)->decltype(p);\

         template <typename T>\

struct has_property_##name:public std::integral_constant<bool, sizeof(check_property_##name<T>(*static_cast<T*>(0))) != sizeof(char)>\

{};\

         char check_method_##name(...);\

         template <typename T>\

         void* check_method_##name(T const& t, decltype(&(T::##name)) p = 0);\

         template <typename T>\

struct has_method_##name : public std::integral_constant<bool, !has_property_##name<T>::value &&sizeof(check_method_##name<T>(*static_cast<T*>(0))) == sizeof(void*)>\

{}

注意:传参用0的目的是强制转成空指针,然后形成编译展开。

再看网上的一个例子:

http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

(这个上面有好几个例子,非常好)

#include <iostream>

 

template<typename T, typename Sig>                                 

struct has_foo {                    

    template <typename U, U> struct type_check;

    template <typename V> static char (& chk(type_check<Sig, &V::foo>*))[1];

    template <typename  > static char (& chk(...))[2];

    static bool const value = (sizeof(chk<T>(0)) == 1);

};

 

struct A {

    void foo();

};

 

struct B : A {};

 

int main()

{

    using namespace std;

    cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true

    cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; // false

}

 

大家应该明白了吧。本来想把别的几家的说法总结下,但觉得还是转载一下比较好,所以就不再这里赘述了。

  评论这张
 
阅读(454)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017