开发环境: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。

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

  1. javascript引擎执行的过程的理解--语法分析和预编译阶段

    一.概述 js是一种非常灵活的语言,理解js引擎的执行过程对于我们学习js是非常有必要的.看了很多这方便文章,大多数是讲的是事件循环(event loop)或者变量提升的等,并没有全面分析其中的过程. ...

  2. 新生 & 语不惊人死不休 —— 《无限恐怖》读后有感

    开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...

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

    package com.tn.collect; import java.lang.reflect.Method; import java.util.ArrayList; public class Fa ...

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

    泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.ge ...

  5. [转帖]Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞

    Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞 https://news.cnblogs.com/n/647075/ 强烈建议:Chrome 用户请尽快升级浏览器!在谷歌今天发布的紧急补丁程序 ...

  6. 通过反射实现Microsoft Visual Studio International Pack 1.0 SR1里面的两个类

    这两天打算实现拼音和简繁转换的方法, 发现Microsoft Visual Studio International Pack 1.0 SR1 提供了 .    下载地址 但是基于某些原因, 一来下载 ...

  7. Access Violation分成两大类:运行期和设计期(很全的解释)

    用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以 ...

  8. 通过实现System.IComparable接口的CompareTo方法对两个类进行比较

    假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...

  9. 简单看看这两个类 String和StringBuilder

    我记得以前在园子里面讨论这两个类的文章有很多很多,并且还拿出了很多的测试报告,在什么情况下,谁比谁快,在什么情况下,该用谁 不该用谁等等这些,我这里就不比较了,我就简单看看他们里面的内部实现,那就先看 ...

  10. C++学习笔记一 —— 两个类文件互相引用的处理情况

    先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B;  class B;  class B; ……;  class B {……};  这样子. 2. 一个 ...

随机推荐

  1. C#性能优化:为何 x * Math.Sqrt(x) 远胜 Math.Pow(x, 1.5)

    大家好,今天我们来聊一个由 AI 引发的"血案",主角是我们日常开发中可能不太在意的 Math.Pow 函数. 缘起:一个"烧CPU"的爱好 熟悉我的朋友可能知 ...

  2. 深入浅析BIO、NIO、AIO

    https://www.cnblogs.com/henuliulei/p/15143649.html BIO.NIO.AIO Java的I/O演进之路I/O模型 :就是用什么样的通道或者说是通信模式和 ...

  3. S32K148-lptmr配置

    S32K148自带的定时器,配置非常简单,有时候我会用它做任务周期,配置一个1ms定时器中断一次 初始化函数: void LPTMR_init(void) { LPTMR_DRV_Init(INST_ ...

  4. ansible-playbook基础

    主机与用户 你可以为 playbook 中的每一个 play,个别地选择操作的目标机器是哪些,以哪个用户身份去完成要执行的步骤(called tasks). hosts 行的内容是一个或多个组或主机的 ...

  5. 请Deepseek给出简单挖矿模型,及关于挖矿模型的延展性思考

    你能否简单用python写一个挖矿的小循环,简单来说用户提供一个字符串,我们加值后用sha256求散列值,看前导0,一开始挖矿只要很少比如3个前导0,现在真实的比特币网络估计要好多个前导0了 收到!你 ...

  6. vuex入门使用详解

    1.什么是vuex Vuex 是实现组件全局状态(数据)管理的一种机制, 可以方便的实现组件之间数据的共享.数据缓存等等 2.vuex的使用 1.安装完vuex依赖后.在项目的src下新建一个stor ...

  7. 毕昇编译器自动优化实验——docker版

    毕昇编译器高级优化实验指导手册 (Docker版) 前言 本手册旨在提供一个完整的.端到端的毕昇编译器高级优化实验方案.记录了从环境搭建到实验完成的全过程,特别是详细描述了在部署过程中遇到的各类问题及 ...

  8. 【内存泄漏和内存溢出】JavaScript之深入浅出理解内存泄漏和内存溢出

    https://blog.csdn.net/qq_44291585/article/details/122026034 内存泄漏和内存溢出了解内存泄露和内存溢出之前,我们得知道什么是内存!下面就会详细 ...

  9. IP 网络主动监测系统 Renix Active

    ​一.IT网络运维面临的挑战​ 1.网络性能可视化​ • 与公有云和SaaS平台连接的可靠性​ • 广域网线路性能​ • 互联网专线性能​ 2.诊断工具​ • 现场无IT工程师覆盖​ • 诊断的人力费 ...

  10. 超简单!教你用C语言手搓LLM模型

    本文由 愚人猫(Idiomeo) 编写 建议查看博客原文 一.LLM 的数学基础 大语言模型 (LLM) 的底层实现离不开扎实的数学基础,这部分将系统梳理支撑 LLM 的核心数学理论,为后续的代码实现 ...