C++代码书写模板 -- 如何判断函数类型
先说一个简单的方案. 经过验证 g++ 和 vs2010 都可以.
原理就是利用函数类型可以直接转换成函数指针.
- template<class T> bool test( T * t )
- {
- return true;
- }
- bool test( ... )
- {
- return false;
- }
- #include<iostream>
- using namespace std;
- int main()
- {
- int k = 12;
- cout << test(main) << endl;
- cout << test( k ) << endl;
- typedef int(*PtrFun)();
- PtrFun ptr = main;
- cout << test(ptr) << endl;
- cout << test( 12 ) << endl;
- return 0;
- }
再说一个稍微复杂点的方案. g++ 编译没问题. vs2010 编译不过去.
利用了函数类型没有数组的概念. 入梅不存在某个类型的数组, 0 转换 U (*)[1] 自然会失败
- template<class T>
- class IsFunction
- {
- private:
- typedef char ONE;
- typedef struct{char a[2];} TWO;
- template<class U>static ONE test(...);
- template<class U>static TWO test(U (*)[1]);
- public:
- enum{YES = sizeof(IsFunction<T>::test<T>(0)) == 1 };
- enum{NO = !YES};
- };
- template<>
- class IsFunction<T&>
- {
- public:
- enum{YES = 0 };
- enum{NO = !YES};
- }
- template<>
- class IsFunction<void>
- {
- public:
- enum{YES = 0 };
- enum{NO = !YES};
- }
- template<>
- class IsFunction<const void>
- {
- public:
- enum{YES = 0 };
- enum{NO = !YES};
- }
- template<class T>
- long kkk(T&){return IsFunction<T>::YES;}
- #include<iostream>
- using namespace std;
- int main()
- {
- int k = 23;
- cout << kkk(main) << endl;
- cout << kkk(k) << endl;
- cout << IsFunction<int>::YES << endl;
- typedef int(*PtrFun)();
- PtrFun ptr = main;
- cout << IsFunction<PtrFun>::YES << endl;
- return 0;
- }
C++代码书写模板 -- 如何判断函数类型的更多相关文章
- golang中函数类型
今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时 ...
- php 读取文件头判断文件类型的实现代码
php代码实现读取文件头判断文件类型,支持图片.rar.exe等后缀. 例子: <?php $filename = "11.jpg"; //为图片的路径可以用d:/uploa ...
- PHP取二进制文件头快速判断文件类型的实现代码
通过读取文件头信息来识别文件的真实类型. 一般我们都是按照文件扩展名来判断文件类型,但是这个很不靠谱,轻易就通过修改扩展名来躲避了,一般必须要读取文件信息来识别,PHP扩展中提供了类似 exif_im ...
- JS的数据类型判断函数、数组对象结构处理、日期转换函数,浏览器类型判断函数合集
工具地址:https://github.com/BothEyes1993/bes-jstools bes-jstools 100多个基础常用JS函数和各种数据转换处理集合大全,此工具包是在 outil ...
- c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数
一. 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include&l ...
- PHP常用类型判断函数
1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...
- C#中判断bool 类型 代码的最短写法
看到一个关于写最短代码的, 是一个bool类型判断的: public bool IsNull(object val) { if (val == null) { return true; } e ...
- YUI的类型判断函数
1.首先定义一个关于类型的对象,及相关变量 类型判断对象 ar L = Y.Lang || (Y.Lang = {}), STRING_PROTO = String.prototype, TOSTRI ...
- PHP常用类型判断函数总结
1.gettype():获取变量类型 2.is_array():判断变量类型是否为数组类型 3.is_double():判断变量类型是否为倍浮点类型 4.is_float():判断变量类型是否为浮点类 ...
随机推荐
- linux监控平台搭建-磁盘
linux监控平台搭建-磁盘 磁盘:随着大数据快速发展.人工智能.自动化.云平台.数据量指数的增长.磁盘的使用量也在增长.目前的机器基本上采用SSD或者SATA盘,一直有人比较那个好.会不会使用时间短 ...
- Vbat 1.8V,接充電器,GPIO_CHG_EN pin 竟然是 high!
Schematic : Precondition : Vbat 1.8V Plugin adapter Preloader doesn't enable GPIO_CHG_EN Origin : 做個 ...
- php--转码函数
最近在用dedecms二次开发会员功能:大家都知道dedecms编码是GBK格式的:所以在我们在项目中经常需要转码,在我了解中有两种转码方式:一是:iconv:二是mb_convert_encodin ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
- CSS-点赞爱心小动画
爱心图片: HTML: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- js-异步请求音频完成后页面显示
var ajax = new XMLHttpRequest(); ajax.open("get", "http://gzmylike.wedei.com/zt/gzyan ...
- [原创][FPGA]Quartus实用小技巧(长期更新)
0. 简介 在使用Quartus软件时,经常会时不时的发现一些小技巧,本文的目的是总结所查阅或者发现到的小技巧,本文长期更新. 1. Quartus中的模板功能 最近在Quartus II的菜单里找到 ...
- ML| EM
What's xxx The EM algorithm is used to find the maximum likelihood parameters of a statistical model ...
- java常用IO
字节流:FileInputStream.FileOutputStream 字符流:FileWriter.FileReader 转换流:InputStreamReader.OutputStreamRea ...
- Windows下Python的虚拟环境
前言 在开发python的应用程序的时候,有时候会遇到依赖包的版本问题,比如之前开发tensorflow应用的时候需要用到python3.5以下的版本(还是python3),但是日常做其它应用的时候用 ...