模板的使用:如何判断参数是否为一个类
2017-01-22 11:33
309 查看
一、需求引入
如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?
二、模板实现
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct {
char a[2];
} Two;
//如果C是类变量,调用这个
template<typename C>
static One test(int C::*);
//如果C是普通变量,调用这个
template<typename C>
static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
}
三、使用
class MyClass { };
struct MyStruct { };
union MyUnion { };
void myfunc() { }
enum E { e1 } e;
第一种:把类型当做模板自变量(template argument)传进去检验
template <typename T>
void check() {
if (IsClassT<T>::Yes) {
std::cout << " IsClassT " << std::endl;
}
else {
std::cout << " !IsClassT " << std::endl;
}
}
第二种:把类型当做函数调用自变量(function call argument)传进去检验
template <typename T>
void checkT (T) {
check<T>(); //第一种中的模板函数
}
int main() {
//第一种调用
std::cout << "int: ";
check<int>();
std::cout << "MyClass: ";
check<MyClass>();
//第二种调用
std::cout << "MyStruct:";
MyStruct s;
checkT(s);
//第一种调用
std::cout << "MyUnion: ";
check<MyUnion>();
//第二种调用
std::cout << "enum: ";
checkT(e);
std::cout << "myfunc():";
checkT(myfunc);
}
程序输出如下:
int: !IsClassT
MyClass: IsClassT
MyStruct: IsClassT
MyUnion: IsClassT
enum: !IsClassT
myfunc(): !IsClassT
如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?
二、模板实现
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct {
char a[2];
} Two;
//如果C是类变量,调用这个
template<typename C>
static One test(int C::*);
//如果C是普通变量,调用这个
template<typename C>
static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
}
三、使用
class MyClass { };
struct MyStruct { };
union MyUnion { };
void myfunc() { }
enum E { e1 } e;
第一种:把类型当做模板自变量(template argument)传进去检验
template <typename T>
void check() {
if (IsClassT<T>::Yes) {
std::cout << " IsClassT " << std::endl;
}
else {
std::cout << " !IsClassT " << std::endl;
}
}
第二种:把类型当做函数调用自变量(function call argument)传进去检验
template <typename T>
void checkT (T) {
check<T>(); //第一种中的模板函数
}
int main() {
//第一种调用
std::cout << "int: ";
check<int>();
std::cout << "MyClass: ";
check<MyClass>();
//第二种调用
std::cout << "MyStruct:";
MyStruct s;
checkT(s);
//第一种调用
std::cout << "MyUnion: ";
check<MyUnion>();
//第二种调用
std::cout << "enum: ";
checkT(e);
std::cout << "myfunc():";
checkT(myfunc);
}
程序输出如下:
int: !IsClassT
MyClass: IsClassT
MyStruct: IsClassT
MyUnion: IsClassT
enum: !IsClassT
myfunc(): !IsClassT
相关文章推荐
- 如何判断一个直播系统是否使用的是RTMP
- 如何使用JQuery去判断一个元素(对象)是否存在
- [km] 如何判断一个直播系统是否使用的是RTMP
- 如何使用jQuery判断一个元素是否存在
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
- asp.net 如何使用js来判断一个网页是否处于iframe中
- 如何快速判断一个工程是否使用ARC
- 如何判断一个文件是否正在被使用
- 怎么使用jquery判断一个元素是否含有一个指定的类(class)另外如何给元素动态添加类
- 如何用jsp判断网页上一个传值是否为空
- 如何判断一个已知的表中是否存在某个字段,如果不存在就创建它.
- .net C# 如何判断一个对象是否具有某个方法
- VBS中如何判断一个引用对象是否存在?
- 如何判断企业是否适合使用Linux
- 如何判断一个单向链表是否有环路
- 如何判断一个整数是否为奇数
- 如何判断一个文件或目录是否存在
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
- 如何快速判断一个整数是否可以整除另一个整数的理论分析