锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
灝辮璇村姩鎬佺被鍨嬩俊鎭繖鍧楋紝鍙堟垨鑰呰鏄弽灝勩傝嚜鐒?dòng)灱岃瑷鏈韓鎻愪緵鐨勫簾鐗﹖ype_info灝辨噿寰楄浜?jiǎn)锛岄櫎浜?jiǎn)璇佹槑c++涔熶笢鏂芥晥棰︼紝涔熻兘鏀寔鍔ㄦ佷俊鎭箣澶栵紝灝卞埆鏃犵敤澶勪簡(jiǎn)錛屾湁璋佷細(xì)姝e効鍏粡鐨勭敤type_info鍋氱偣姝e効鍏粡鐨勪簨鎯呭憿銆傚洜姝わ紝鍚勮礬浜洪┈綰風(fēng)悍涓婇樀錛岄兘瑕佸譏琛++鍦ㄨ繍琛屾椂綾誨瀷淇℃伅涓婄殑緙哄け銆傚洜涓虹被鍨嬬殑鍙嶅皠淇℃伅瀹炲湪澶噸瑕侊紝鎴栬呰錛屽弽灝勭殑鐢ㄦ涔嬪湴澶澶錛岃〃闈笂寰堝浜嬫儏涓嶉渶瑕佸弽灝勶紝鎴栬呭瓧闈唬鐮佷笂灝辯湅涓嶅埌鍙嶅皠鐨勭棔榪癸紝浣嗘槸鍐呴噷鐨勫疄鐜幫紝澶ф妸澶ф妸鐨勫弽灝勫湪鍙戝厜鍙戠儹銆俢++鍧氭寔涓嶅湪鍔ㄦ佷俊鎭笂緇欎簣涓鐐圭偣澶氫綑鐨勬敮鎸侊紝騫朵笉琛ㄧずc++灝變笉闇瑕佸弽灝勪簡(jiǎn)錛岀湅鐪嬫爣鍑嗗簱榪欎釜鏋佸姏鍥為伩鍔ㄥ鎬佺殑鍏歌寖錛屾槸涓涓庢牱鐨勫け璐ヤ綔鍝侊紝鍡紝榪欎釜浠ュ悗鍐嶈皥鍚с傚亣濡俿tl涓寮濮嬪氨娌℃湁濡傛澶у姏鎺掓枼鍔ㄥ鎬侊紝浣犵湅鐪嬪氨榪炲唴瀛樺垎閰嶇殑allocator閮藉彲浠ュ仛鍒伴潤(rùn)鎬佺被鍨嬩俊鎭噷闈紙鏈鏂扮増鐨刢++緇堜簬涔熻鎺ュ彈澶氭佺殑allocator錛宑++鐣屽眳鐒朵竴鐗囨鍛奸紦鑸烇紝鐪熸槸鎮(zhèn)插搥錛夛紝浠婃椂浠婃棩鐨刢++灝變笉浼?xì)鍦ㄥ緢澶氶鍩熶笂鍒板鍓插湴姹傚拰銆?br />
鎬葷殑鏉ヨ錛岀幇鍦ㄥ競(jìng)闈笂鐨刢++鍙嶅皠搴擄紝閮芥槸渚靛叆寮忥紝閮藉鐫mfc閭d竴濂楋紝閮芥槸瑕佹眰緇ф壙鑷竴涓熀綾籓bject錛岀劧鍚庢墠鑳藉澶栨彁渚涘弽灝勪俊鎭殑鍔熻兘錛屽厛涓嶈瀹冧滑鎻愪緵鐨勭被鍨嬩俊鎭槸鍚﹀畬澶囷紝榪欐牱瀛愬氨鎶婄敤閫斿箍娉涢檺鍒舵鍦ㄤ竴涓緢紿勫緢紿勭殑灝忓湀瀛愰噷闈簡(jiǎn)銆傝繖浜涘弽灝勫簱錛?銆佷笉鑳藉弽灝勫熀鏈被鍨嬶紝int銆乧har銆乨ouble銆乧onst char*銆?#8230;…絳夛紱2銆佷笉鑳藉弽灝勯潪緇ф壙鑷狾bject鐨刢lass鎴栬卻truct錛?銆佷篃涓嶈兘鍙嶅皠妯℃澘綾伙紝姣斿vector<int>銆乴ist<vector<vector<int>>>銆傝櫧鐒秚ypeid鍗冭埇寮遍浮錛屼絾涔熼潪涓鏃犳槸澶勶紝璧風(fēng)爜闈炰鏡鍏ャ佸鉤絳夈佸鎬併傛墍浠ワ紝鐞嗘兂鐨勫弽灝勶紝搴旇鍍廲++鍘熺敓鐨則ypeid閭f牱鏃犺壊鏃犲懗錛?銆侀潪渚靛叆寮忕殑錛?銆佸彲浠ュ鎵鏈夌殑綾誨瀷閮芥彁渚涘弽灝勶紝鍩烘湰綾誨瀷銆侀潪Object緋葷殑struct鎴栬卌lass銆乼emplate綾誨瀷鐨勶紱3銆佸鎬佺殑錛屽彧瑕佹敼綾誨瀷闇瑕佽繍琛屾椂鐨勭被鍨嬭瘑鍒紝閭d箞灝辮繑鍥炲叾鏈韓鐨勭被鍨嬶紙瀛愮被錛夛紝鑰岄潪瀛楅潰涓婄殑澹版槑綾誨瀷錛?銆佹敮鎸佺被鍨嬪弬鏁幫紝涔熷嵆鏄錛屼互綾誨瀷浼犻掔粰璇ュ嚱鏁版椂錛屽氨榪斿洖鐩稿簲鐨勭被鍨嬩俊鎭璞°?br />
璇村緱鍏蜂綋涓鐐癸紝鎴戜滑瑕佹眰鐨勫弽灝勫簱鏄繖鏍峰瓙鐨勩傚綋鐒?dòng)灱岄鍏堣鏈変竴涓被鍨嬩俊鎭璞ypeInfo錛岄噷闈㈣婊′簡(jiǎn)鍏充簬瀵逛簬綾誨瀷鐨勬墍鏈夎緇嗕俊鎭傚涓嬫墍紺猴細(xì)鍙互鐚滃埌榪欑鍙嶅皠涓嬫鏋訛紝鍙敮鎸佸崟緇ф壙錛岃繖鏄晠鎰忕殑銆?br />
{
public:
template<typename Args>
void ConstructObject(void* obj, MemoryAllocator* alloc, Args&& args)const錛?br /> bool IsDerviedOf(const TypeInfo* base)const;
public:
virtual TIType GetTIType()const = 0;
virtual const InterfaceMap* GetInterfaces()const錛?br /> virtual jushort GetMemorySize()const錛?br /> virtual ConstText GetName() const錛?br /> virtual AString GetFullName()const錛?br /> virtual jushort GetAlignSize() const錛?br /> virtual ConstText GetSpaceName()const;
virtual const TypeInfo* GetBaseTypeTI()const;
virtual const TypeInfo* GetPointeedTI()const錛?br /> virtual size_t GetHashCode(const void* obj)const;
virtual bool IsValueType()const { return true; }
virtual bool IsClass()const { return true; }
virtual bool DoInitAllocator(void* obj, MemoryAllocator* memAlloc)const;
virtual bool NeedDestruct()const { return false; }
virtual void DoDefaultConstruct(void* obj)const;
virtual bool CanDefaultConstruct()const { return true; }
virtual void DoAssign(void* dest, const void* src)const;
virtual bool Equals(const void* objA, const void* objB)const;
virtual void DoDestruct(void* obj)const;
};
TypeOf<int>() == TypeOf(n); //n涓烘暣鍨?br />TypeOf<vector<int>>() == TypeOf(nums);//nums鐨勭被鍨嬩負(fù)vector<int>
Object* a = new ObjectA; TypeOf(a) == TypeOf<ObjectA>();
鍏跺疄榪欓噷闈㈢殑鍘熺悊涔熸病浠涔堢濂囷紝鏃犻潪灝辨槸trait閰嶅悎sfine錛屾帴涓嬫潵灝卞叏閮ㄩ兘鏄嫤鍔涙椿錛屽氨鏄負(fù)姣忎竴縐嶇被鍨嬮兘涓撻棬鐗瑰寲涓涓緇嗘弿榪扮殑綾誨瀷瀵硅薄錛岀敤瀹忓彲浠ヨ妭鐪佸ぇ閲忕殑浠g爜銆備絾鏄暣涓弽灝勫簱錛屾湰搴у墠鍓嶅悗鍚庨噸鏋勪簡(jiǎn)鍗佸嚑嬈★紝鐜板湪涔熻繕鍦ㄩ噸鏋勪箣涓紝緇堢┒榪樻槸瑙e喅浜?jiǎn)寮鍙戜笂鎵閬囧埌鐨勫悇縐嶄簨鎯呫傛瘮濡傦紝搴忓垪鍖栵紙鏀寔鎸囬拡銆佹敮鎸佸鎬侊級(jí)銆佸璞′笌xml鐨勪簰鎹€佸璞′笌json鐨勪簰鎹€佹暟鎹簱琛ㄨ鍐欏璞°佹牸寮忓寲銆丄ny綾誨瀷銆侀潪渚靛叆寮忔帴鍙c佹秷鎭彂閫併佸瓧絎︿覆鐢熸垚瀵硅薄絳夌瓑銆?br />鍏跺疄鐜版柟寮忥紝姒傛嫭璧鋒潵錛屽氨鏄紩鍏ラ棿鎺ュ眰鍏冨嚱鏁癟ypeInfoImp涓撻棬鐢ㄤ簬榪斿洖涓涓被鍨媡ype錛宼ype閲岄潰鏈変竴涓狦etTypeInfo()鐨勫嚱鏁般傜劧鍚嶵ypeOf璋冪敤TypeInfoImp閲岀殑type鐨凣etTypeInfo()鏈緇堝緱鍒癟ypeInfo瀵硅薄銆備唬鐮佸涓嬫墍紺恒?br />
{
typedef Ty type;
static const bool value = THasGetTypeInfoMethod<Ty>::value;
};
template<typename Ty>
struct TypeInfoImp<const Ty> : public TypeInfoImp<Ty>
{
typedef typename TypeInfoImp<Ty>::type type;
static const bool value = TypeInfoImp<Ty>::value;
};
template<typename Ty>
const TypeInfo* TypeOf()
{
typedef typename TypeInfoImp<Ty>::type TypeInfoProvider;
return TypeInfoProvider::GetTypeInfo();
}
template<typename Ty>
const TypeInfo* TypeOf(const Ty& obj)
{
typedef typename IsRttiType<Ty>::type is_rtti; //鍙堟槸闂存帴灞傦紝瀵瑰姩鎬佺被鍨嬪拰闈炲姩鎬佺被鍨嬪垎鍒鐞?/span>
return ImpTypeOf(obj, is_rtti());
}
template<>
struct TypeInfoImp < bool >
{
static const bool value = true;
typedef TypeInfoImp<bool> type;
static TypeInfo* GetTypeInfo();
};
TypeInfo* TypeInfoImp<bool>::GetTypeInfo()
{
static TypeInfo* ti = CreateNativeTypeInfo<bool>("bool");
return ti;
}
struct TypeInfoImp < std::pair<FstTy, SndTy> >
{
static const bool value = true;
typedef TypeInfoImp < std::pair<FstTy, SndTy> > type;
static TypeInfo* GetTypeInfo()
{
ParamsTypeInfo<FstTy, SndTy> args;
return PodPair::LookupTemplateTypeInfo(args);
}
};
鎻愬彇鍏剁被鍨嬪弬鏁扮殑const TypeInfo*錛岀敓鎴愭暟緇勩傜敤姝ゆ暟緇勫埌PodPair鐨勫搱甯岃〃閲岄潰鏌ユ壘錛屽鏋滃搱甯岃〃涓互鏈夋綾誨瀷鏁扮粍鍙傛暟鐨勫璞″氨榪斿洖錛屽惁鍒欒鍒涘緩涓涓坊鍔犱竴鏉″搱甯屾潯鐩紝鐒跺悗榪斿洖銆傛瘡涓涓硾鍨嬬被鍨嬶紝姣斿vector錛宭ist錛宲air閮芥湁涓涓睘浜庤嚜宸辯殑鍝堝笇琛ㄣ?br />鎵撳畬鏀跺伐銆傚師鐞嗗緢綆鍗曪紝浣嗘槸瀵逛簬宸ヤ笟綰х殑鍙嶅皠搴擄紝瑕佽冭檻寰堝緇嗚妭錛屾瘮濡傦紝TypeInfo瀵硅薄鐨勫唴瀛樼鐞嗭紱鎬庝箞涓篹num綾誨瀷鐢熸垚涓鍫嗗瓧絎︿覆錛屼互鏀寔瀛楃涓插拰enume鍊肩殑浜掔浉杞崲錛涚敓鎴愬茍淇濆瓨class鐨勬瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鎸囬拡錛涘懡鍚嶇┖闂寸殑鏀寔錛涗豢鐪烠#閲岄潰鐨刟ttribute錛涘浣曚互鏈鏂逛究鐨勬柟寮忕敓鎴愭垚鍛樺瓧孌墊垨鑰呮垚鍛樺嚱鏁頒俊鎭瓑絳夛紝涓鍙ヨ瘽錛屽氨鏄粬濡堢殑浣撳姏媧匯備絾鏄紝鍥炴姤鏄緢涓扮洓鐨勶紝榪欓噷鐨勮嫤鍔涙椿鍋氬畬涔嬪悗錛岀▼搴忕殑鍏朵粬鍦版柟涓婏紝鍩烘湰涓婏紝灝辨病鏈変粈涔堥噸澶嶇浉浼肩殑浠g爜錛屼竴鍒囩殑浣撳姏宸ヤ綔鍏ㄩ儴灝卞彲浠ュ帇鍦ㄧ被鍨嬩俊鎭繖閲屼簡(jiǎn)銆?/div>
]]>
鍏跺疄錛屾暟鎹被鍨嬪茍涓嶉噸瑕侊紝閲嶈鐨勬槸鏁版嵁涓婅兘澶熸敮鎸佺殑榪愮畻闆嗗悎浠ュ強(qiáng)榪欎簺榪愮畻鑳借繍鐢ㄧ殑鍦哄悎銆?br />濂戒簡(jiǎn)錛屽洖鍒頒笂鏂囷紝鎴戜滑鐢╛ZPP_INC_N鎼炰簡(jiǎn)10涓暟錛岄氳繃澶嶅埗綺樿創(chuàng)錛屽彲浠ユ妸N澧炲姞鍒?55銆傚疄闄呰繍鐢ㄤ腑錛屽畬鍏ㄨ凍澶熺敤浜?jiǎn)銆?br />#define _ZPP_INC_JOIN(_A, _B) _ZPP_INC_JOIN_IMP1(_A, _B)
#define _ZPP_INC_JOIN_IMP1(_A, _B) _ZPP_INC_JOIN_IMP2(~, _A##_B)
#define _ZPP_INC_JOIN_IMP2(p, res) res
#define PP_INC(x, ) _ZPP_INC_JOIN(_ZPP_INC_, x)
#define _ZPP_INC_0 1
#define _ZPP_INC_1 2
#define _ZPP_INC_2 3
#define _ZPP_INC_3 4
#define _ZPP_INC_4 5
#define _ZPP_INC_5 6
#define _ZPP_INC_6 7
#define _ZPP_INC_7 8
#define _ZPP_INC_8 9
#define _ZPP_INC_9 10
...
#define _ZPP_INC_255 256
鍚屾牱鐨勬柟寮忥紝鍐嶅娉曟場(chǎng)鍒禤P_DEC錛屼粠256寮濮嬶紝涓鐩撮掑噺鍒?涓烘銆傚浜庡ぇ浜?56鐨勬暟錛屽氨涓嶆敮鎸佷簡(jiǎn)錛岄偅灝遍兘鏄湭瀹氫箟鎿嶄綔銆傝繖鏍峰瓙錛岄氳繃PP_INC(n)錛屽氨寰楀埌n+1錛涜孭P_DEC(n)錛屽垯鏄痭-1銆傛瘮濡侾P_INC(PP_DEC(9))錛屽叾緇撴灉鑲畾鏄?浜?jiǎn)銆傚緢濂斤紝榪欐牱瀛愶紝鍦ㄩ澶勭悊涓氨瀹炵幇浜?jiǎn)鑷劧鏁拌嚜澧?鍜岃嚜鍑?鐨勮繍綆椾簡(jiǎn)銆傚彟澶栵紝瀵逛簬澶т簬256鐨勬暟錛屾瘮濡?12浼犻掔粰PP_INC錛屽氨鍙緱鍒頒竴涓猒ZPP_INC_512鐨勭鍙鳳紝瀹屽叏娌℃湁浠諱綍鎰忎箟銆?br />
鐒跺悗錛屼袱涓嚜鐒舵暟鏄惁鐩哥瓑鐨勫垽鏂紝涔熼潪甯擱噸瑕侊紝蹇呴』鏀寔銆備絾鏄紝鍦ㄦ涔嬪墠錛岃瀹炵幇涓涓畯鍑芥暟PP_NOT錛岀敤鏉ュ垽鏂叆鍙傛槸鍚︿負(fù)0銆備負(fù)0鐨勮瘽錛屽垯鍑芥暟榪斿洖1錛屽惁鍒欙紝灝辮繑鍥?銆備篃鍗蟲槸錛?br />PP_NOT(0) == 1
PP_NOT(23) == 0錛屾垨鑰?PP_NOT(var) == 0銆?br />璁頒綇錛岄澶勭悊鎻愪緵緇欐垜浠殑鍘熺敓綾誨瀷灝卞彧鏈夌鍙峰拰##騫舵帴榪愮畻錛岄櫎姝や箣澶栵紝鍒棤浠栫墿銆傚ソ鍍忓伐鍏峰お綆闄嬶紝鑳藉畬鎴愮洰鐨勫悧錛熶笉寰椾笉浣╂湇鏈変簺鐮佺尶鐨勮剳媧炪備互涓嬩唬鐮佹槸榪欐牱榪愪綔鐨勶紝鍋囪PP_NOT鐢熸垚浠ヤ笅鐨勮皟鐢ㄥ艦寮忥紝鍏堜笉綆P_ARG1錛岃嚦浜庣鍙穨錛屾槸榪欐牱瀛愮殑錛屽彲浠ョ湅鎴愭櫘閫氱殑鍙橀噺鍚嶅瓧錛屽畠?yōu)鏄崰浣嵔W︼紝鍥犱負(fù)棰勫鐞嗗彧璇嗗埆閫楀彿(,)錛屽拰灝忔嫭鍙鳳紝鑷充簬鍏朵粬絎﹀彿錛屽畬鍏ㄦ棤瑙嗭紝閭d簺鏄疌/C++緙栬瘧闃舵鎵嶅叧蹇?jī)鐨劷W﹀彿銆?br />PP_NOT(0) = PP_ARG1(~, 1, 0)
PP_NOT(n) = PP_ARG1(_ZPP_NOT_n, 0)
鐒跺悗錛岃PP_ARG1鍙栫浜屼釜鍙傛暟錛堢爜鐚跨殑璁℃暟鏄粠0寮濮嬬殑錛屼篃鍗蟲槸錛?鍗蟲槸1錛?鍗蟲槸2錛夛紝灝卞畬鎴愪換鍔′簡(jiǎn)銆傝嚦浜巁ZPP_NOT_n鏄粈涔堥錛岄偅涓彧鏄腑闂寸敓鎴愮殑涓存椂絎﹀彿錛屽彲浠ヨ垗寮冦傛垜浠彧闇瀵筥ZPP_NOT_0鍋氱壒鍒鐞嗐傚洜姝わ紝浠g爜鍙互榪欐牱鍐欎簡(jiǎn)銆侾P_PROBE()鐢ㄤ互鐢熸垚涓や釜鍏ュ弬
#define PP_PROBE() ~, 1
#define _ZPP_NOT_0 PP_PROBE()
#define PP_NOT(_X, ...) PP_IS(PP_JOIN(_ZPP_NOT_, _X))
# define PP_IS(...) PP_ARG1(__VA_ARGS__, 0)
榪欐牱瀛愪箣鍚庯紝鏄劇劧PP_NOT(n)灝卞彲浠ュ彉鎴怭P_ARG1(_ZPP_NOT_n, 0)鐨勫艦寮忎簡(jiǎn)銆侾P_NOT涓嶆槸鍙渶涓涓叆鍙傚悧錛熶負(fù)浣曞悗闈㈣繕瑕佸甫鐪佺暐鍙鳳紝綰補(bǔ)鏄負(fù)浜?jiǎn)鍚庨潰鍚効U嶅彉鎬佺殑榪愮敤錛屽彇鎮(zhèn)︾紪璇戝櫒銆傚凡緇忕敤瀹忔潵鍐欎唬鐮佷簡(jiǎn)錛屽氨涓嶅繀鍐嶉伒瀹堜粈涔堟竻瑙勬垝寰嬶紝鍙鑳藉畬鎴愪換鍔″氨琛屼簡(jiǎn)銆?br />
鑷充簬PP_ARG1鐨勫疄鐜幫紝灝卞緢綆鍗曚簡(jiǎn)錛屽涓嬫墍紺猴紝
#define PP_ARG0(_0, ...) _0
#define PP_ARG1(_0, _1, ...) _1
#define PP_ARG2(_0, _1, _2, ...) _2
鐒跺悗閫氳繃涓ゆ鍙栧弽鐨勫嚱鏁幫紝鍐嶈ˉ涓婂嚱鏁癙P_BOOL錛屽鏋滃叆鍙?gt;0錛屽氨榪斿洖1錛屽惁鍒欒繑鍥?錛岀被浼間簬鏁村瀷鍒癰ool鐨勫己鍒剁被鍨嬭漿鎹€?br />#define PP_BOOL(_X, ...) PP_NOT(PP_NOT(_X))
鏈変簡(jiǎn)榪欎簺鐨勯摵鍨箣鍚庯紝瑕佹瘮杈冧袱涓嚜鐒舵暟鏄惁鐩哥瓑錛屽氨綆鍗曚簡(jiǎn)銆傚叾瀹炴病浠涔堢縐樼殑錛屽氨鏄拡瀵逛粠0鍒?55錛岄噸澶?56涓互涓嬪艦寮忕殑#define璇彞錛?br />#define _ZPP_0_EQUALS_0 PP_PROBE()
#define _ZPP_1_EQUALS_1 PP_PROBE()
#define _ZPP_2_EQUALS_2 PP_PROBE()
...
#define PP_EQUALS(x, y) PP_IS(PP_CONCAT4(_ZPP_, x, _EQUALS_, y))
PP_EQUALS灝辨槸灝嗗叆鍙傚茍鎺ユ垚_ZPP_x_EQUALS_y鐨勫艦寮忥紝鍙x鍜寉鐩稿悓錛屼篃鍗蟲槸璇達(dá)紝瀹冧滑鍦ㄤ笂闈㈢殑琛ㄦ牸涓紝閭d箞錛岄亾鐞嗗氨濡傚悓PP_NOT鐨勫疄鐜伴偅鏍鳳紝鏈鍚庣粨鏋滃氨鏄?浜?jiǎn)銆傚叾瀹烇紝棰勫鐞嗕腑娌℃湁鍒ゆ柇榪欑鐜╂剰錛屽彧鏈夎〃鏍鹼紝鍙湁騫舵帴錛屽彧鏈夋煡琛ㄣ傛墍璋撶殑鍥劇伒瀹屽錛岃鐧戒簡(jiǎn)錛屾病鏈夌巹铏氱殑錛屽氨鏄緩琛紝鐒跺悗鏌ヨ〃銆傚鐩哥瓑姣旇緝鍙栧弽PP_NOT錛岃嚜鐒跺氨寰楀埌涓嶇浉絳夌殑鍒ゆ柇鍑芥暟銆?br />#define PP_UN_EQUALS(x, y) PP_NOT(PP_IS(PP_CONCAT4(_ZPP_, x, _EQUALS_, y)))
鍐嶆寤鴻〃錛屽氨鍙互寰楀埌bool榪愮畻鐨勫嚱鏁幫紝鎴栦笌
#define PP_OR(a,b) PP_CONCAT3(_ZPP_OR_, a, b)
#define _ZPP_OR_00 0
#define _ZPP_OR_01 1
#define _ZPP_OR_10 1
#define _ZPP_OR_11 1
#define PP_AND(a,b) PP_CONCAT3(_ZPP_AND_, a, b)
#define _ZPP_AND_00 0
#define _ZPP_AND_01 0
#define _ZPP_AND_10 0
#define _ZPP_AND_11 1
鍐嶅噯澶囦竴寮犺〃鏍鹼紝灝嗗瓧鑺傛槧灝勫埌8涓簩榪涘埗浣嶃?br />#define _ZPP_BINARY_0 (0, 0, 0, 0, 0, 0, 0, 0)
#define _ZPP_BINARY_1 (0, 0, 0, 0, 0, 0, 0, 1)
#define _ZPP_BINARY_2 (0, 0, 0, 0, 0, 0, 1, 0)
#define _ZPP_BINARY_3 (0, 0, 0, 0, 0, 0, 1, 1)
#define _ZPP_BINARY_4 (0, 0, 0, 0, 0, 1, 0, 0)
...
鐒跺悗閫氳繃妯℃嫙璁$畻鏈虹粍鎴愬師鐞嗛噷闈㈢殑鍔犲噺涔橀櫎鐨勫師鐞嗭紝灝卞彲浠ュ疄鐜板洓鍒欒繍綆椾簡(jiǎn)銆傚浜?jiǎn)锛屾暣涓澶勭悊搴撶殑浠g爜閮藉湪鍘嬀~╁寘涓婏紝鍔熻兘姣攂oost鐨勯澶勭悊搴撳己澶氫簡(jiǎn)錛屼絾鏄唬鐮佸嵈灝戜簡(jiǎn)寰堝錛屼篃瀹規(guī)槗鐞嗚В澶氫簡(jiǎn)錛屾墍鏈変唬鐮佸湪vs涓嬮潰姝e父榪愯錛屽叾浠栧鉤鍙拌繕娌℃湁嫻嬭瘯銆備唬鐮佸寘錛?a href="/Files/huaxiazhihuo/preprocessor.rar" style="color: #3366ff;">/Files/huaxiazhihuo/preprocessor.rar
]]>
鎴戜滑榪樻槸鏉ヨ璁篶++鍚э紝榪欏嚑騫村湪c++閲岄潰鐜╀唬鐮佽嚜鍔ㄧ敓鎴愭妧鏈紝鑰岄澶勭悊鏄笉鍙伩鍏嶏紝涔熸槸涓嶅彲鎴栫己鐨勯噸瑕佸伐鍏楓傝櫧鐒禸oost pp棰勫鐞嗗簱鍦ㄥ畯鐨勮繍鐢ㄤ笂寰堟槸瀹屽杽錛屼絾鏄唬鐮佷篃澶浜?jiǎn)锛岃屼笖浠g爜寰堜笉濂界悊瑙o紝瀵規(guī)錛屼笉鍏嶈浜虹枒鎯戯紝鏈夊繀瑕佹悶寰楅偅涔堝鏉傦紝鎼為偅涔堝浠g爜鍚楋紵騫朵笖錛岀湅浜?jiǎn)boostpp鐨勪嬌鐢ㄦ帴鍙e悗錛屾劅瑙夊啓寰楀緢涓嶅共鍑錛屼篃涓嶅ソ緇勫悎銆傚洜姝わ紝閲嶆柊鍋氫簡(jiǎn)涓濂楅澶勭悊鐨勮疆瀛愩備互涓嬬殑浠g爜錛屽亣璁懼湪msvc2013浠ヤ笂鐨勭増鏈繍琛岋紝鍙嶆寰堝浜虹敤MSVC鐨勶紝瑁呴肩殑鑷綋鍒錛岄犲嚭鏉ョ殑杞瓙錛屽懼悜浜庡厛鏀寔msvc銆?br />
棣栧厛錛屾垜浠畾涔変竴涓畯錛岀敤鏉ョ粰鎶婂叆鍙傚彉鎴愬瓧絎︿覆錛屽挦錛岃繖涓簨鎯呬篃澶猠asy浜?jiǎn)锛屼絾鏄Q屽湪姝わ紝鎰熻錛岃繕鏄湁蹇呰搴熻瘽澶氳В閲婁竴涓嬨備互涓嬩唬鐮佹儻渚嬮兘鏄紝鎵鏈夊彲鐢ㄧ殑瀹忓嚱鏁伴兘鏄互PP寮澶村叏閮ㄥぇ鍐欙紝鑰屼互_ZPP寮澶寸殑鍏ㄩ儴閮芥槸鍐呴儴瀹炵幇錛屽叾瀹炶繕鍙互鍋氬緱鏇撮毦鐪嬩竴鐐廣傚洜涓哄畯鍑芥暟鏄叏灞鐨勶紝娌℃湁浣滅敤鍩熺殑姒傚康錛屽茍涓斿彧鏄崟綰殑鏂囨湰鏇挎崲錛屾鐨勬椂鍊欙紝榪樹笉鐭ラ亾鎬庝箞姝伙紝鎵浠ワ紝蹇呴』璋ㄦ厧瀵瑰緟銆傚儚鏄痺indows.h澶存枃浠墮偅鏍鳳紝鐩存帴鐢╩in錛宮ax浣滀負(fù)瀹忕殑鍚嶅瓧錛岃櫧鐒剁敤璧鋒潵寰堟柟渚匡紝浣嗕篃涓嶇煡閬撳埗閫犱簡(jiǎn)澶氬皯楹葷儲(chǔ)錛屾墍浠ワ紝寰堝鏃跺欙紝鍖呭惈windows.h鏃訛紝絎竴浠朵簨鎯呭氨鏄痷ndef min鍜宮ax銆?br />
浠ヤ笅鐨勪唬鐮侊紝鍙互闅忎究鍦ㄦ煇涓伐紼嬩笅錛岄殢渚垮緩绔嬩竴涓猚pp鍚庣紑鍚嶇殑婧愭枃浠訛紝鐒跺悗鎸塁TRL+F7緙栬瘧錛屼笉闇瑕丗5錛屽氨鍙互鐪嬪埌榪愯鐨勬晥鏋滐紝濡傛灉緙栬瘧閫氳繃錛屽氨璇存槑瀹忓熀鏈笂姝g‘錛屾祴璇曚唬鐮佽秺澶氾紝鍑嗙‘鎬у氨瓚婇珮銆傚綋鐒?dòng)灱屼綘浠篃鍙互閫氳繃璁劇疆婧愭枃浠剁殑灞炴э紝璁﹎svc鐢熸垚棰勫鐞嗗悗鐨勬枃浠訛紝鐒跺悗鐢ㄨ浜嬫湰鎵撳紑閭d釜鏂囦歡瑙傜湅銆?br />
#define _ZPP_TEXT(str) #str) static_assert((__VA_ARGS__), PP_TEXT(__VA_ARGS__));
濂戒簡(jiǎn)錛屾祴璇曞噯澶囧緩绔嬭搗鏉ワ紝灝卞彲浠ュ紑濮嬭倖鏃犲繉鎯殑鍐欎唬鐮佷簡(jiǎn)銆備竴姝ヤ竴姝ュ湴鏋勫緩c棰勫鐞嗗畯鐨勫浘鐏靛畬澶囥?br />鏄劇劧錛屽綋鍔′箣鎬ワ紝鏈鏍規(guī)湰鐨勫畯灝辨槸灝嗕袱涓畯鍙傛暟鐨勫茍鎺ワ紝涔熷嵆鏄?#榪愮畻絎︼紝鏄劇劧濂芥瘮#榪愮畻閭f牱瀛愶紝蹇呴』緇欓噷闈㈠弬鏁版湁瀹忓睍寮鐨勬満浼?xì)锛屽洜姝よ闂存帴璋冪敤锛屼笅闈㈡槸鍏跺疄鐜?br />
#define _ZPP_JOIN_I(_A, _B) _ZPP_JOIN_II(~, _A##_B)
#define _ZPP_JOIN_II(p, res) res
#define A 20
#define B 10
PP_ASSERT(PP_JOIN(A + B, == 30))
#define _ZPP_INC_JOIN_IMP1(_A, _B) _ZPP_INC_JOIN_IMP2(~, _A##_B)
#define _ZPP_INC_JOIN_IMP2(p, res) res
#define PP_INC(x, ) _ZPP_INC_JOIN(_ZPP_INC_, x)
#define _ZPP_INC_0 1
#define _ZPP_INC_1 2
#define _ZPP_INC_2 3
#define _ZPP_INC_3 4
#define _ZPP_INC_4 5
#define _ZPP_INC_5 6
#define _ZPP_INC_6 7
#define _ZPP_INC_7 8
#define _ZPP_INC_8 9
#define _ZPP_INC_9 10
PP_ASSERT(PP_INC(PP_INC(9)) == 11)
PP_ASSERT(PAIR_SECOND(10, 20) == 20)
濂藉儚鏄紪璇戝櫒娌℃湁鍏堝睍寮MAKE_PAIR(10, 20)錛岀劧鍚庡啀璋冪敤PAIR_SECOND錛岃屾槸鐩存帴鎶奙AKE_PAIR(10, 20)鏁翠釜褰撴垚涓涓嚱鏁頒紶緇橮AIR_SECOND錛岀劧鍚庯紝PAIR_SECOND灝辨彁紺哄疄鍙備笉瓚籌紝鐒跺悗錛岀‖瑕佹祴璇曪紝
#define _ZPP_IMP_INVOKE_JOIN_I(_A, _B) _ZPP_IMP_INVOKE_JOIN_II(~, _A##_B)
#define _ZPP_IMP_INVOKE_JOIN_II(p, res) res
#define PP_INVOKE(m, args, ) _ZPP_INVOKE_JOIN(m, args)
緙栬瘧閫氳繃浜?jiǎn)锛屽ソ涓嶅?guī)槗鍟婏紒
]]>