文章目录
1 编写程序判断一个变量是不是指针
拾遗:
- C++中仍然支持C语言中的可变参函数。
- C++编译器匹配的调用优先级
- 重载函数。
- 函数模板。
- 变参函数。
思路:
- 将变量分为两类:指针和非指针。
- 编写函数:
- 指针变量调用时返回true。
- 非指针变量调用时返回false。
函数模板与变参函数的化学反应:
编程实验:指针判断
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test()
{
}
virtual ~Test()
{
}
};
template
<typename T>
bool IsPtr(T* v) // match pointer
{
return true;
}
bool IsPtr(...) // match non-pointer
{
return false;
}
int main(int argc, char *argv[])
{
int i = 0;
int* p = &i;
cout << "p is a pointer: " << IsPtr(p) << endl; // true
cout << "i is a pointer: " << IsPtr(i) << endl; // false
Test t;
Test* pt = &t;
cout << "pt is a pointer: " << IsPtr(pt) << endl; // true
cout << "t is a pointer: " << IsPtr(t) << endl; // false 运行时崩溃,变参无法处理对象的拷贝问题
return 0;
}
上诉实现版本存在的缺陷:
- 变参函数无法解析对象参数,可能造成程序崩溃!
进一步的挑战:
- 如何让编译器精确匹配函数,但不进行实际的调用?sizeof。
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test()
{
}
virtual ~Test()
{
}
};
template
<typename T>
char IsPtr(T* v) // match pointer
{
return 'd';
}
int IsPtr(...) // match non-pointer
{
return 0;
}
#define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))
int main(int argc, char *argv[])
{
int i = 0;
int* p = &i;
cout << "p is a pointer: " << ISPTR(p) << endl; // true
cout << "i is a pointer: " << ISPTR(i) << endl; // false
Test t;
Test* pt = &t;
cout << "pt is a pointer: " << ISPTR(pt) << endl; // true
cout << "t is a pointer: " << ISPTR(t) << endl; // false
return 0;
}
参考资料: