
C++和模板元编程
SammyLan
当你的才华还撑不起你的野心时,那你就应该静下心来学习。
展开
-
深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
注:本文所有观点纯属推测,请勿盲目信任 前言:本文是前一篇文章的续篇,在阅读本文之前请先阅读前一篇文章>.在开始本文讨论之前,先给出一段代码,后面将基于这段代码进行讨论.//Base.h#pragma once#include using namespace std;struct Base1{ virtual int __stdcall Base1原创 2010-04-10 12:14:00 · 1724 阅读 · 0 评论 -
模板元编程:接受一个复合类型C作为第一个参数,并将其中的类型A替换为类型B
template struct type_replace; //接受一个复合类型C作为第一个参数,并将其中的类型A替换为类型B typedef type_replace :: result_type t1; // int* typedef type_replace :: result_type t2; // long* [10] typedef type_replace :: result_type t3;// long (*)(long, con原创 2010-09-01 21:14:00 · 2091 阅读 · 4 评论 -
判断n是否是N的整数次方(N是2的N次方)
昨天翻了下自己以前的博客,看到这样一道题:" 判断一个数是否是4的整数次方",就想能不能用模板的方式将4扩展到2,4,8,...2^n的所有情况呢?于是将题目改为:"判断n是否是N的整数次方,其中N必须是2的整数次方且大于1,如果传的N不符合规范,则编译错误"template bool isPowerOf(size_t n)以下是代码实现template struct Static原创 2014-09-24 10:48:10 · 1032 阅读 · 0 评论 -
求类的数据成员的大小
前阵子点点问我一个问题:对于浦东的变量,我们可以使用sizeof(obj)来求其大小但是对于一个类的数据成员,却不能用sizeof(类名::数据成员)的方式来求其大小有没有什么办法可以实现类似的需求呢?下面是我提供的一种解决方案但是该解决方案有一个缺点,就是只能对public的数据成员求值对于private或者protected的数据成员,则只能在类原创 2009-06-10 16:23:00 · 1052 阅读 · 0 评论 -
深入理解C++对象模型-对象的内存布局,vptr,vtable
前言:本文将用到另一篇文章所提供的类模板类ReinterpretCast,详细请参考文章> vtpr的位置:为了支持多态,C++引入了vtpr和vtable这两个概念.对于每个有虚函数的类,C++都会为其生成一个vtable,并在类中添加一个隐含的数据成员vptr. 对于vptr在对象中的位置,跟类的数据成员的布局一样,C++标准里面并没有做出任何的规定.但是对于特定的编译器,我们还是可以通过原创 2010-04-09 23:49:00 · 5098 阅读 · 0 评论 -
深入理解C++对象模型之类型转换:ReinterpretCast
在C++中,没有任何一种转换操作符可以将成员指针转换成其它类型数据类型,那有没有办法获取到成员指针的值呢?有的人会说可以通过sprintf,atoi等函数获取.那有没有更简单通用的方法呢?答案是有的.我们可以通过template 和 union实现任何类型到另一兼容类型的(所谓兼容是指,两种类型的大小一致)转换操作符 ReinterpretCast.在给出这一实现之前,我们先来先来探讨一原创 2010-04-08 20:35:00 · 2497 阅读 · 1 评论 -
如何打印虚表和虚函数指针的值(only for VS)
#include using namespace std;typedef void (__thiscall *Func)(void*pThis); Func * GetVptr(void* pThis, int iOffset=0){ static union { int iVal; Func * vptr;原创 2009-11-12 19:46:00 · 1561 阅读 · 0 评论 -
庖丁解牛之--std::bind
std::bind真是个好东西.在C++ 11之前,boost有个类似的东西boost::bind,其实现比较复杂.自从C++ 11出引入模板的不定参数,右值引用(完美转发),auto等机制之后,实现就变得容易多了,本文在C++11对std::bind进行解析.原创 2016-04-01 15:16:35 · 546 阅读 · 0 评论