C++编译期判断是否能够转型
#include <iostream>
#include <vector>
using namespace std; template<class T,class U>
class Conversion
{
private:
typedef char Small;
class Big{char dummy[];};
static Small test(U);
static Big test(...);
static T makeT();
public:
enum{ exists =
sizeof(test(makeT()))==sizeof(Small) };
enum{ exists2Way =
exists && Conversion<U,T>::exists};
enum{
sameType=false};
}; template<class T>
class Conversion<T,T>
{
public:
enum{exists=,exists2Way=,sameType=};
}; #define SUPERSUBCLASS(T,U)\
(Conversion<const U*,const T*>::exists && \
!Conversion<const T*,const void*>::sameType)
#define SUPERSUBCLASS_STRICT(T,U)\
(SUPERSUBCLASS(T,U) && \
!Conversion<const T,const U>::sameType)
class Shape
{
public:
virtual void display()
{
cout<<"Shape"<<endl;
}
}; class Circle:public Shape
{
public:
virtual void display()
{
cout<<"Circle()"<<endl;
}
}; int _tmain(int argc, _TCHAR* argv[])
{
cout<<Conversion<double,int>::exists<<endl;
cout<<SUPERSUBCLASS(Shape,Circle)<<endl;
cout<<SUPERSUBCLASS_STRICT(Shape,Circle)<<endl;
return ;
}
C++编译期判断是否能够转型的更多相关文章
- java编译期优化
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...
- JVM-程序编译与代码早期(编译期)优化
早期(编译期)优化 一.Javac编译器 1.Javac的源代码与调试 Javac的源代码放在JDK_SRC_HOME/langtools/src/shares/classes/com/sun/too ...
- 深入理解Java虚拟机读书笔记6----早期(编译期)优化
六 早期(编译期)优化 1 “编译期”的含义 · 可能是指一个前端编译器把*.java文件转变成*.class文件的过程,前端编译器如:Sun的Javac.Eclipse JDT中的增量式 ...
- 深入理解JVM - 早期(编译期)优化
Java“编译期”是一段“不确定”的操作过程:可能是指一个前端编译器(编译器的前端)把*.java文件转变为*.class文件的过程:可能是指虚拟机的后端运行期编译器(JIT编译器,Just In T ...
- 《深入理解Java虚拟机》-----第10章 程序编译与代码优化-早期(编译期)优化
概述 Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运 ...
- 深入了解JVM虚拟机8:Java的编译期优化与运行期优化
java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译: ...
- java 编译期常量
今天在看书的时候遇到了一个不是很懂的名词,是在think in java 这本书的第七章讲final关键字时讲到的.然后自己在网上查了一下知道了一些. 编译器常量就是:它的值在编译期就可以确定的常量. ...
- Javac早期(编译期)
从Sun Javac的代码来看,编译过程大致可以分为3个过程: 解析与填充符号表过程. 插入式注解处理器的注解处理过程. 分析与字节码生成过程. Javac编译动作的入口是com.sun.tools. ...
- c++ 编译期计算 (一)
编译期就是编译器进行编译,产生.obj文件的所处的那一段时间(如果是广义的编译期,那么一般还包括了链接期,因为现在很多编译器都会自动调用链接器进行链接)执行期就是你执行某个已经链接好的程序的那段时间. ...
随机推荐
- Android - FrameLayout覆盖顺序
FrameLayout覆盖顺序 本文地址: http://blog.csdn.net/caroline_wendy FrameLayout: Child views are drawn in a st ...
- RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
RapeLay(电车之狼R)的结局介绍 (隐藏结局) 必备知识要让MM怀孕非常easy.起初刚进入调教模式后.仅仅要H一次 MM就開始有时期状态. 生理(连上有红晕) ->不详状态(闭目第一次) ...
- 项目源码--Android基于LBS地理位置信息应用的客户端
下载源码 技术要点: 1. LBS应用框架客户端实现 2. 登录与注册系统 3. TAB类型UI实现 4. HTTP通信模块 5. 源码带详细的中文注释 ...... 详细介绍: 1. LBS应用框架 ...
- [转]AFNetWorking使用笔记
转载自:http://blog.sina.com.cn/s/blog_719d537e01017x82.html AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection ...
- 关于删除linux多余内核
step 1: 查找当前正在使用的内核文件的版本号 #uname -r step 2: 列出所有的内核文件,使用rpm 或者 dpkg(基于linux系统) 命令 #rpm -q kernel 或者 ...
- C++/CLR Sqlite初探
error C2491: "acosh": 不允许 dllimport 函数 的定义 asinh": 不允许 dllimport 函数 的定义 a ...
- 自定义 Yasnippet 模板
yasnippet可以把我们常用的代码段或文本储存起来,到使用的时候只需键入几个字母就会自动带出. 比如我们在写python代码时,常常会在文件的第一行写下: #!/usr/bin/env pytho ...
- linux配置LAMP
VPS注意:最近在VPS安装过程中,MYSQL老是报错 dpkg: error processing package mysql-server-5.6 (--configure): subproces ...
- PPI_network&calc_ppi
# -*- coding: utf-8 -*- # __author__ = 'JieYao' from biocluster.agent import Agent from biocluster.t ...
- Maven中settings.xml的配置项说明
本文部分引用自:http://haohaoxuexi.iteye.com/blog/1827778 在Maven中提供了一个settings.xml文件来定义Maven的全局环境信息.这个文件会存在于 ...