c++ template 判断是否为类类型

/* The following code example is taken from the book
* "C++ Templates - The Complete Guide"
* by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002
*
* (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*/
#include <iostream>

template<typename T>
class IsClassT {
private:
	typedef char One;
	typedef struct { char a[2]; } Two;
	template<typename C> static One test(int C::*);
	template<typename C> static Two test(...);
public:
	enum { Yes = sizeof(test<T>(0)) == 1 };
	enum { No = !Yes };
};

class MyClass {
};

struct MyStruct {
};

union MyUnion {
};

void myfunc()
{
}

enum E { e1 } e;

// check by passing type as template argument
template <typename T>
void check()
{
	if (IsClassT<T>::Yes) {
		std::cout << " IsClassT " << std::endl;
	}
	else {
		std::cout << " !IsClassT " << std::endl;
	}
}

// check by passing type as 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);
}

  

时间: 2024-12-08 18:27:21

c++ template 判断是否为类类型的相关文章

js获取或判断任意数据类类型的通用方法(getDataType)和将NodeList转为数组(NodeListToArray)

function getDataType(any){ /* (1) Object.prototype.toString.call 方法判断类型: 优点:通用,返回"[object String]" 具体object的类型 缺点:不能返回继承的类型 (2)typeof x 缺点:对object类型不能细分: 优点:对空null的判断 'undefined'的应用; 返回类型有:'undefined' "string" 'number' 'boolean' 'funct

c++模板元编程七:类型判断的traits类

2 用于判断类型的traits类 is_void类可以判断模板参数的类型,使用很简单,注意,也可以直接使用::value. cout << std::is_void<void>::type::value << endl; cout << std::is_void<bool>::type::value << endl; 但是实现很有趣,特化居然可以用来继承不同的类.这里没有去找clang++实现代码,用boost代码代替吧. templ

OpenCv学习笔记(三)---OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释及其OpenCv中源代码的详细分析

/********************************************************************************************* 程序功能: OpenCv的基本数据结构源代码的解读,我们常用的OpenCv的基本数据结构有六种: 1--Point类 2--Size类 3--Rect类 4--Scalar类 5--Vec3b--向量模板类 6--Range类 编写环境: OpenCv2.4.8+VS2010 地点时间: 陕西师范大学 201

6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明,只读的计算属性*/ var fullName:String { get } } /** 实现协议*/ struct Person:FullNamed { /** 实现协议  可以把计算属性实现为存储属性,更改其本身的性质*/ var fullName: String = "abc" }

怎样判断js对象的类型

在编写js程序的过程中,可能常常需要判断一个对象的类型,例如你写了一个函数,需要通过判断不同的参数类型来编写不同的代码. 首先可能会想到typeof操作符,看下面的这个例子: <script type="text/javascript"> var object = {}; var b = true; alert(typeof object + " " + typeof b); </script> 得到的结果如下: 从上面的结果可以看到,用ty

自定义数据类型 C++ 结构体类型 共同体类型 枚举类型 类类型{}

一.结构体类型 结构体类型,共用体类型,枚举类型,类类型等统称为自定义类型(user-defined-type,UDT). 结构体相当于其他高级语言中的记录(record);例如: struct Student{ int num; char name[20]; char sex; int agel float score; char addr[30]; }; 结构体声明的一般形式: struct 结构体类型名 {成员列表}: 结构体类型名用作结构体类型的标志,上面的Student就是结构体类型名

SWIFT中用Switch case 类类型

有时觉得SWIFT的语法真的强大而又变态,不说了,直接上代码瞅瞅: 首先先定义一个交通工具的父类 class Vehicle{ var wheels:Int! var speed:Double! init(wheels:Int,speed:Double){ self.speed = speed self.wheels = wheels } func run(){ println("The \(self.wheels) wheels is running as \(self.speed) spee

判断js中的类型:typeof / instanceof / constructor / prototype

如何判断js中的类型呢,先举几个例子: var a = "jason"; var b = 123; var c = true; var d = [1,2,3]; var e = new Date(); var f = function(){ alert('jason'); }; 一.最常见的判断方法:typeof typeof是一个一元运算符,它返回的结果始终是一个字符串,对不同的操作数,它返回不同的结果,另外typeof可以判断function的类型:在判断除Object类型的对象时

如何利用jquery.1.9版本判断浏览器的版本类型

如何利用jquery.1.9版本判断浏览器的版本类型:在jquery.1.9以前的版本,可以使用$.browser很轻松的判断浏览器的类型和版本,但是在1.9中和以后的版本中,$.browser已经被删除,下面就介绍一下如何实现此功能,希望能够给需要的朋友带来帮助.一.自定义代码: $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase()); $.browser.webkit = /webkit/.test(navi