static_cast<any::holder<double> *>(operand->content)->held
而any_cast针对指针的版本是这样:
使用boost::any实现virtual template成员函数
事实上,boost库已经提供了这样的类boost::any,下面我就为你讲述它的原理及构造。
事实上,any_cast的代码是这样的:
但是前面说过,operand->content实际指向的是any::holder<int>,所以这个static_cast是“非法”的,然而事实是:它能通过编译!原因很简单: holder<double>是placeholder的派生类,而operand->content的类型正是placeholder。从基类指针到派生类指针的转换被认为是合法的。但这却酿成大错,因为表达式#2的类型将因此被推导为double!原先holder<int>只给int held;成员分配了sizeof(int)个字节的内存,而现在却要将int型的held当作double型来使用,也就是说使用sizeof(double)个字节内存。所以这就相当于:
这样的Accept函数能够接受任意类型的数据,并且是virtual函数。
// #2
boost::any原理与结构
下面就看一看boost库是如何具体实现这两点的。
当转换操作符的设想彻底失败后,我们只能借助于某些“外来”的显式转换操作。就向static_cast<>一样。boost提供了any_cast<>,于是你可以这样写:
使用typeinfo让我们有可能在运行时发现这种类型不符并及时抛出异常。但有个违反直观的事情是上面的那行错误的代码仍能通过编译,并且你也无法阻止它通过编译,因为holder<int>和holder<double>都是placeholder的基类。所以只能期望程序员们清楚自己在做什么,魔域私服,要不然就给他个异常瞧瞧。
这虽然并非any的全部源代码,但是所有重要的思想已经表露无遗。剩下的部分只是一些简单的细节,请参见boost库的原文件。
boost源码剖析之:泛型指针类any之海纳百川(rev#2)
C++是强类型语言,所有强类型语言对类型的要求都是苛刻的,类型一有不合编译器就会抱怨说不能将某某类型转换为某某类型,当然如果在类型之间提供了转换操作符或是标准所允许的一定程度的隐式转换(如经过非explicit构造函数创建临时变量的隐式转换或是在int,long这些基本类型间的)又另当别论。总的说来,为了保持类型安全,C++有严厉的要求。然而有时候程序员可能有这样的需要:
刘未鹏
2. 它必须提供某些有关它所保存的对象类型的信息。
这显然已经丧失了anyVal的优势——以单个对象接受所有类型的数据。与其这样还不如直接写:
“但是等等!”,你急切的说:“你失去了类型的信息,传奇私服。”唔...的确,当赋值的模板函数返回后你也就失去了关于类型的信息。考虑下面你可能想要写出的代码:
C++的罗浮宫(http://blog.csdn.net/pongba)
动机
如你所知,C++中没有提供virtual template function。然而有时候你的确会有这种需要,any可以一定程度上满足这种需要,例如,
这样的代码。
这两个any_cast版本应该很好理解。此外后一个版本中#1处的类型检查也是必要的,如果没有这个检查,考虑以下代码:
首先,any类里面一定要提供一个模板构造函数和模板operator=操作符。因为你必须允许用户写出:
考虑这样的一个“泛型指针类”该如何设计是很有趣的事情。
boost::anyVal=i;其实将anyVal.content指针指向了一个holder<int>对象(请回顾上面的代码)。然后any_cast<double>(anyVal)实际上调用了any_cast<>针对指针的重载版本,并将anyVal的地址传递过去,也就是转到#1处,因为调用的是any_cast<double>,所以#1处的代码被编译器实例化为:
1. 它本身不能是模板类,因为如果它是模板,你必须为它的具现化提供模板参数。而事实上你并不想这样做。你想让同一个对象接受任意类型的数据。在上面的代码中这个对象是anyVal。然而,如果你必须为它提供模板参数,那么上面的代码看起来就会像这样:
其次,数据的存放之所是个问题,显然你不能将它保存在any类中,那会导致any类成为模板类,后者是明确不被允许的。数据应该动态存放,即动态分配一个数据的容器来存放数据,而any类中则保存指向这个容器的指针,明确地说,是指向这个容器的基类的指针,这是因为容器本身必须为模板,而any类中的指针成员又必须不是泛型的(因为any不能是泛型的,所以any中所有数据成员都不能是泛型的),所以,结论是:为容器准备一个非泛型的基类,而让指针指向该基类。
所以,any不能是模板类。
传奇外传私服(展开文章)
这将通过编译,传奇私服发布网,且运行期通常竟然也不会出错,下面我为你解释为什么会这样。
3. 它必须提供某种方法将它保存的数值“取出来”。
天龙八部sf外挂
请使用1024*768分辨率浏览本站以达到游戏最佳视觉效果
打击盗版支持正版游戏 任何组织或个人未经同意,不得使用和传播盗版游戏,如有侵犯利益请来电告知说明,本站72小时内删除。