读loki有感,编译阶段发现两个类能否转化

开发环境:VS2005(VC8)

以下代码在VS2002上运行不了,据说VS2002(VC7)不完全支持偏特化,VS2003(VC7.1)就支持了。

问题提出:

一,已知类型T,U,在编译阶段如何知道T能否转化成U。

template <class T, class U>

struct ConversionHelper

{

static long   Test(...);//WQ注:C++中,不定参数已不需要“至少一个定参”了。

static short Test(U);

static T MakeT();

};

template <class T, class U>

struct Conversion

{

typedef ConversionHelper<T, U> H;

enum { exists = sizeof(short) == sizeof(H::Test(H::MakeT())) };

};

class A

{

public:

A()

{

TRACE("\r\nAr\n");

}

};

class  B : public A

{

public:

B()

{

TRACE("\r\nBr\r\n");

}

};

测试代码:

bool b1 = Conversion<B,A>::exists;

bool b2 = Conversion<A,B>::exists;

运行结果分别为true,false.

二,接上面的问题。如果T能转化成U,则定义一个U类型的对象,否则定义T类型的变量。

template <int flag, typename T, typename U>

struct Select

{

typedef U Result;

};

template <typename T, typename U>

struct Select<0, T, U>

{

typedef T Result;

};

测试代码:

Select<Conversion<B,A>::exists,B,A>::Result type;

type的类型是A;B不再继承与A,则type类型是B。

时间: 2024-10-07 01:33:59

读loki有感,编译阶段发现两个类能否转化的相关文章

读loki有感,TYPEList原理

问题一,简化版的TYPEList,只支持int型 template<int n> class TYPEList { public: int Head; TYPEList<n-1> Tail; }; template<> class TYPEList<0> { public: int Tail; int Head; }; 测试代码 TYPEList<0> l0; l0.Head = 1; l0.Tail = 2; TYPEList<2>

javascript运行过程中的“预编译阶段”和“执行阶段”

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行), 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预编译中,javascript对这两种声明做出了两种处理方案 <scri

【java】泛型的作用是在编译阶段防止错误输入,绕过编译就绕过泛型,可用反射验证

1 package com.tn.collect; 2 3 import java.lang.reflect.Method; 4 import java.util.ArrayList; 5 6 public class Fanxin { 7 public static void main(String[] args){ 8 //泛型的作用是在编译阶段防止错误输入,绕过编译就绕过了泛型 9 //反射都是绕过编译操作 10 ArrayList<String> str=new ArrayList&l

大道至简 读后有感

大道至简  读后有感 结束大一的课程,自己总结收获,并没有觉得自己在计算机方面有了什么明显的进步,很想在以后的学习里能有所进步,而且这学期又新增了很重要的java课程,所以决定痛下决心,好好学习一番,便想以这<大道至简>作为开篇. 这几天看了本书的第一章,第一章的总体理念为编程的精义,共分为5个小结,即编程的精义,会或不会写程序,程序等于结构加算法,语言以及在没有工程的时代. 在编程的精义这一小节中,开篇便以愚公移山这一寓言故事来类比编程这一项工作,它通过古文中的话来形象的比喻了编程工作中的各

自动属性(编译阶段和运行阶段的不同是什么,托管和非托管的不同)

public class student { public int Id{get;set;}这个就是自动属性,在编译阶段完成 } 问题1:编译阶段和运行阶段的不同 编译阶编译器干了什么事情 答: 问题2:运行阶段干了什么事情 答: 问题3:托管代码和非托管代码的区别 4.

读国内预科的阶段有哪些

IFC本科预科是大学基础课程或桥梁课程,属大学前的预备教育,一般都要求海外高中毕业生读1年左右的预科,以适应国外的学习方式,同时它也是西方教育体系中重要的一环,它在国外教育体系中属于高等教育的范畴,由于IFC预科在从基础教育顺利接轨高等教育的阶段中所起的不可替代的作用,它被称为高中教育跨越到高等教育的重要基石. 基础教育与高等教育在知识结构和教学方法等方面在客观上都存在着较大的跨度.在国内,大学一年级新生普遍感到对大学教学.生活的不适用,甚至感到有些茫然.在中学,更多的是知识被动的灌输:而在国外

java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGeneri

java5核心基础之泛型(3)-泛型作用于编译阶段-如何将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候只能传入指定类型数据到泛型集合对象中去.如何验证呢,贴代码如下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGenericInt

两个类相互包含引用的问题--类前向声明

1.背景 编程中遇到如下错误:使用不完全类型**以及**前向声明. 查找相关资料后发现是类的前向声明(forward declaration)问题:在程序中声明一个类后,此类是一个不完全类型(incompete type),即已知此类是一个类型,但不知道包含哪些成员. 不完全类型只能以有限方式使用,不能定义该类型的对象.不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数. 2.为什么需要前向声明 在构造自己的类时,有可能会碰到两个类之间