C++对象模型(上)
要实现完善的C++反射机制,我们需要深入了解C++的对象模型。但是很遗憾,C++标准并没有明确规定C++对象模型,而是把这个自由度交给了编译器,不同的编译器下产生的对象并不一定是二进制兼容的。不过比较幸运的是主流的编译器实现的方式都大同小异,而且,我们很多时候并不一定需要深入到编译结果,通过宏和模板就能解决大部分的问题。
一、全局函数
全局函数(或者静态函数)是比较容易通过模板获取到函数类型信息的,通过一个模板函数就可以:
template< typename RetType, typename... Param >
inline void CreateGlobalFunWrap(RetType ( *pFun )( Param... ),
const char* szType, const char* szName)
{
IFunctionWrap* pWrap = TFunctionWrap<RetType, Param...>::GetInst();
STypeInfoArray InfoArray = MakeFunArg<RetType, Param...>();
CScriptBase::RegisterGlobalFunction(pWrap, (uintptr_t)pFun, InfoArray, szType, szName);
}
#define REGIST_GLOBALFUNCTION_IMPLEMENT( _fun_type, _function, _fun_name_lua ) \
XS::SGlobalE