【二十】一个面试题
来源:互联网 发布:安徽卫视网络直播 编辑:程序博客网 时间:2024/05/16 08:23
面试题:
写函数判断一个变量是否为指针?
要解决这个问题,要用一个巧妙的方法,先回顾一下相关知识点:
- C++中仍然支持C语言中的可变参数函数
- C++编译器的函数匹配调用优先级
- 重载函数
- 函数模板
- 可变参数函数
Tip:
如果同时存在普通函数和其重载版本、模板函数、可变参数函数,编译器会优先调用普通函数和其重载版本,然后依次时模板函数和可变参数函数!
示例:
#include <cstdlib>#include <iostream>using namespace std;void test(int i, int j){ cout<<"int test(int i, int j)"<<endl;}template<typename T>void test(T i, T j){ cout<<"T test(T i, T j)"<<endl;}void test(...){ cout<<"int test(...)"<<endl;}int main(int argc, char *argv[]){ int i = 0; int j = 0; test(i, j); cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}
运行结果:
知道了上述知识点,就可以解决面试题了!
利用函数模板与可变参数函数的匹配优先级,判断一个变量是否是指针:
#include <cstdlib>#include <iostream>using namespace std;template<typename T>void IsPtr(T* i){ cout<<"true"<<endl;}void IsPtr(...){ cout<<"false"<<endl;}int main(int argc, char *argv[]){ int *pi = nullptr; double *pd = nullptr; int i = 0; IsPtr(pi); IsPtr(pd); IsPtr(i); cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}
Tip:
如果是指针类型,编译器就会优先匹配模板函数,如果匹配不上,才匹配可变参数函数!
这种方法虽然解决了问题,但是效率却不高,再做一些改进!
#include <cstdlib>#include <iostream>using namespace std;#define ISPTR(v) (sizeof(IsPtr(v)) == sizeof(int))template<typename T>int IsPtr(T* i);char IsPtr(...);int main(int argc, char *argv[]){ int *pi = nullptr; double *pd = nullptr; int i = 0; cout << ISPTR(pi) << endl; cout << ISPTR(pd) << endl; cout << ISPTR(i) << endl; cout << "Press the enter key to continue ..."; cin.get(); return EXIT_SUCCESS;}
Tip:
上述代码,本质上还是利用函数匹配优先级,但是我们增加了sizeof运算符,该运算符是在编译器就处理的,所以在编译器结果就被计算好了。通过函数返回值的大小差异,来判断编译器调用了哪个函数,从而判断是否是指针!
0 0
- 【二十】一个面试题
- 【面试题二十】顺时针打印矩阵
- java面试题二十 try catch
- 微软面试题<十>
- 面试题之十
- iOS面试题十
- 面试题(十)
- H5---面试题十
- C/C++面试题十
- 面试题(十)Oracle
- Java面试题之十
- iOS 面试题(十)
- hadoop面试题整理(十)
- C++经典面试题(十)
- 十道经典面试题
- Java面试题(十)
- Java面试题之十
- 【面试题】五道面试题二
- 线性分类器:Fisher线性判别
- Ajax提高篇(4)在请求和响应中使用 XML(2)
- Java程序员们都用的8大开发工具
- linux-sudo apt-get update
- Why BIOS loads MBR into 0x7C00 in x86 ?
- 【二十】一个面试题
- jquery设置控件位置的方法
- Oracle 10g新增DROP DATABASE命令
- iOS AutoLayout自动布局中级开发教程(7)-底部顶部baseLine基线对齐
- eclipse中配置jetty环境一
- xib的几个用法 来自别人的博客。。
- Ajax提高篇(5)使用JSON 进行数据传输
- 桶排序时的gap以及桶的个数
- 华为OJ(二)——图片整理