- C++ 中仍然支持 C 语言中的可变参数函数
- C++ 编译器的匹配调用优先级
- 重载函数
- 函数模板
- 变参函数
思路:将变量分为两类,指针和非指针,使用函数模板与变参函数。传入指针时首先匹配函数模板,传入非指针变量时,匹配的是可变参数函数。
// 50-1.cpp
#include<iostream>
using namespace std;
class Test
{
public:
Test()
{
}
virtual ~Test()
{
}
};
template<typename T>
char IsPtr(T* v)
{
return 'd';
}
int IsPtr(...) // 三个点表示可接受任何函数
{
return 0;
}
#define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))
int main()
{
int i = 0;
int* p = &i;
cout << "p is a pointer: " << ISPTR(p) << endl;
cout << "i is a pointer: " << ISPTR(i) << endl;
Test t;
Test* pt = &t;
cout << "pt is a pointer: " << ISPTR(pt) << endl;
cout << "t is a pointer: " << ISPTR(t) << endl;
return 0;
}
当传入指针时匹配函数模板,当传入变量时匹配可变参数函数。
但是变参函数无法解析对象参数,不能向变参函数中传入类对象。其实我们匹配到函数时已经可以区分了,能不能只进行匹配,不调用函数呢,我们使用了宏,编译时 sizeof(IsPtr§ 已经可以确定大小,指针匹配到 char IsPtr(T* v),就知道返回 char,大小为 1,变量匹配到 int IsPtr(…),就知道返回 int,大小为 4。这样就可以只匹配不调用函数。
编译运行:
$ g++ 50-1.cpp -o 50-1
$ ./50-1
p is a pointer: 1
i is a pointer: 0
pt is a pointer: 1
t is a pointer: 0
小结:
1、C++ 中仍然支持变参函数
2、利用函数模板和变参函数能够判断指针变量