commit 2025-09-28 17:19 add template parameter 'bool TTypebUseCRTP' inZtCTypeNowCRTP : ZCppMain/ZMainHead.H
This commit is contained in:
@ -1243,7 +1243,7 @@ namespace ZNsMain
|
|||||||
//////////////////////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
/*/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/*#########################################################################################
|
||||||
|
|
||||||
■ class ZtCTypeCRTP<> 의 단점은 상속하지 않은 class 형은 알 수 없는데, 이것을 알아내기 위해
|
■ class ZtCTypeCRTP<> 의 단점은 상속하지 않은 class 형은 알 수 없는데, 이것을 알아내기 위해
|
||||||
|
|
||||||
@ -1275,30 +1275,65 @@ namespace ZNsMain
|
|||||||
|
|
||||||
정말 멋진 기교가 아닌가. C++ 의 향기에 잠시 취해 보자. -- 2013-06-10 00:33:00
|
정말 멋진 기교가 아닌가. C++ 의 향기에 잠시 취해 보자. -- 2013-06-10 00:33:00
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
|
■ ZtCTypeNowCRTP 의 template parameter 에 bool TTypebUseCRTP 추가. -- 2025-09-28 15:55
|
||||||
|
|
||||||
template<typename TTypeNow, typename TTypeChild>
|
TTypeChild 가 ZCEmpty 이거나 TTypebUseCRTP 이 false 이면, 아래가 된다.
|
||||||
|
|
||||||
|
public: enum{ZEUseCRTP=0};
|
||||||
|
public: typedef TTypeNow TypeData;
|
||||||
|
public: typedef TTypeNow TypeBase;
|
||||||
|
|
||||||
|
■ 3번 template parameter 가 bool TTypebUseCRTP 인데, 만약 TTypeChild 가 유효한 자료형이라
|
||||||
|
면, TTypebUseCRTP 이 true 인 것이 맞겠으나, DEBUG 등의 특수한 용도로 TTypebUseCRTP 을
|
||||||
|
false 로 설정할 수 있게 한 것이다.
|
||||||
|
|
||||||
|
주로 ZtCTypeCRTP 와 같이 사용해, 가상 함수를 사용하지 않고도 상속을 통해 다형성을 구현하
|
||||||
|
거나 기능 확장을 하고 싶을 때 사용한다. 보통 CRTP 는 상속을 전제로 하는 상황에서 주로 쓰
|
||||||
|
이지만, ZtCTypeNowCRTP 는 꼭 상속하지 않아도 된다.
|
||||||
|
|
||||||
|
사용예는 ZtCBaseList 에 있다.
|
||||||
|
|
||||||
|
-- 2025-09-28 16:13
|
||||||
|
|
||||||
|
#########################################################################################*/
|
||||||
|
|
||||||
|
template
|
||||||
|
<typename TTypeNow, typename TTypeChild, bool TTypebUseCRTP>
|
||||||
class ZtCTypeNowCRTP
|
class ZtCTypeNowCRTP
|
||||||
{
|
{
|
||||||
public: enum{ZEUseCRTP=1};
|
public: enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
|
||||||
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
||||||
public: typedef TTypeChild TypeData;
|
public: typedef TTypeChild TypeData;
|
||||||
public: typedef TTypeNow TypeBase;
|
public: typedef TTypeNow TypeBase;
|
||||||
};
|
};
|
||||||
template<typename TTypeNow>
|
|
||||||
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty>
|
template
|
||||||
|
<typename TTypeNow, typename TTypeChild>
|
||||||
|
class ZtCTypeNowCRTP<TTypeNow, TTypeChild, false /*++*/ >
|
||||||
{
|
{
|
||||||
public: enum{ZEUseCRTP=0};
|
public: enum{ZEUseCRTP=0};
|
||||||
public: typedef TTypeNow TypeData;
|
public: typedef TTypeNow TypeData;
|
||||||
public: typedef TTypeNow TypeBase;
|
public: typedef TTypeNow TypeBase;
|
||||||
};
|
};
|
||||||
template<typename TTypeNow>
|
|
||||||
class ZtCTypeNowCRTP<TTypeNow, void >
|
template
|
||||||
|
<typename TTypeNow, bool TTypebUseCRTP>
|
||||||
|
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty , TTypebUseCRTP>
|
||||||
{
|
{
|
||||||
public: enum{ZEUseCRTP=0};
|
public: enum{ZEUseCRTP=0};
|
||||||
public: typedef TTypeNow TypeData;
|
public: typedef TTypeNow TypeData;
|
||||||
public: typedef TTypeNow TypeBase;
|
public: typedef TTypeNow TypeBase;
|
||||||
};
|
};
|
||||||
////////////////////////////////////////////////
|
|
||||||
|
template
|
||||||
|
<typename TTypeNow>
|
||||||
|
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty , false /*++*/ >
|
||||||
|
{
|
||||||
|
public: enum{ZEUseCRTP=0};
|
||||||
|
public: typedef TTypeNow TypeData;
|
||||||
|
public: typedef TTypeNow TypeBase;
|
||||||
|
};
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -5239,11 +5274,11 @@ namespace ZNsMain
|
|||||||
typedef ZCLink* iterator ;
|
typedef ZCLink* iterator ;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef ZNsType::ZtCTypeNowCRTP ///////////////////
|
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
|
||||||
<
|
<
|
||||||
ZtCBaseList, typename TTypeCRTP::TypeData
|
ZtCBaseList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
|
||||||
>
|
>
|
||||||
ZCTypeNowCRTP ; ///////////////////////////////////
|
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
|
||||||
|
|
||||||
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
|
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
|
||||||
|
|
||||||
@ -5355,11 +5390,19 @@ namespace ZNsMain
|
|||||||
TypeSize ml_LinkCnt ;
|
TypeSize ml_LinkCnt ;
|
||||||
private :
|
private :
|
||||||
|
|
||||||
|
TypeChild& GetChildObj()
|
||||||
|
{
|
||||||
|
return *static_cast<TypeChild*>(this);
|
||||||
|
}/*
|
||||||
|
TypeChild& GetChildObj()*/
|
||||||
|
|
||||||
|
private :
|
||||||
|
|
||||||
_VT_ ZCLink* NewLink()
|
_VT_ ZCLink* NewLink()
|
||||||
{
|
{
|
||||||
if(TTypeCRTP::ZEUseCRTP<1) return new ZCLink;
|
if(TTypeCRTP::ZEUseCRTP<1) return new ZCLink;
|
||||||
|
|
||||||
return (*static_cast<TypeChild*>(this)).NewLink();
|
return GetChildObj().NewLink();
|
||||||
}/*
|
}/*
|
||||||
_VT_ ZCLink* NewLink()*/
|
_VT_ ZCLink* NewLink()*/
|
||||||
|
|
||||||
@ -5368,7 +5411,7 @@ namespace ZNsMain
|
|||||||
if(TTypeCRTP::ZEUseCRTP<1)
|
if(TTypeCRTP::ZEUseCRTP<1)
|
||||||
{ return new ZCLink(AO_ArgData); }
|
{ return new ZCLink(AO_ArgData); }
|
||||||
|
|
||||||
return (*static_cast<TypeChild*>(this)).NewLink(AO_ArgData);
|
return GetChildObj().NewLink(AO_ArgData);
|
||||||
}/*
|
}/*
|
||||||
_VT_ ZCLink* NewLink(TypeArg AO_ArgData)*/
|
_VT_ ZCLink* NewLink(TypeArg AO_ArgData)*/
|
||||||
|
|
||||||
@ -5377,7 +5420,7 @@ namespace ZNsMain
|
|||||||
if(TTypeCRTP::ZEUseCRTP<1)
|
if(TTypeCRTP::ZEUseCRTP<1)
|
||||||
{ delete AP_DelLink; return; }
|
{ delete AP_DelLink; return; }
|
||||||
|
|
||||||
return (*static_cast<TypeChild*>(this)).DelLink(AP_DelLink);
|
GetChildObj().DelLink(AP_DelLink);
|
||||||
}/*
|
}/*
|
||||||
_VT_ void DelLink(ZCLink* AP_DelLink)*/
|
_VT_ void DelLink(ZCLink* AP_DelLink)*/
|
||||||
|
|
||||||
|
@ -67,7 +67,6 @@ namespace ZNsMain
|
|||||||
{cout<<"#6 Value="<<ArgiValue<<", HelpObj Ptr="<<&AR_CHelpObj<<" With CHelpObj Half Ref"<<endl;}
|
{cout<<"#6 Value="<<ArgiValue<<", HelpObj Ptr="<<&AR_CHelpObj<<" With CHelpObj Half Ref"<<endl;}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef ZtCStringBase<char> CStringBase ;
|
typedef ZtCStringBase<char> CStringBase ;
|
||||||
@ -84,6 +83,159 @@ namespace ZNsMain
|
|||||||
typedef ZtCBaseList
|
typedef ZtCBaseList
|
||||||
<CStringBase, CStringBaseC&> CStringList2 ;
|
<CStringBase, CStringBaseC&> CStringList2 ;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
class ZCBaseListEx10 : public ZtCBaseList
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx10, true>
|
||||||
|
>
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
|
||||||
|
template //////////////////////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
typename TType , typename TTypArgu ,
|
||||||
|
typename TTypeAlloc , typename TTypSize ,
|
||||||
|
typename TMoveObj , typename TTypeCRTP
|
||||||
|
>
|
||||||
|
friend class ZtCBaseList; /*#############################################*/
|
||||||
|
|
||||||
|
typedef ZtCBaseList ///////////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx10, true>
|
||||||
|
>
|
||||||
|
ZCBaseList; ///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
friend class ZtCBaseList //////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx10, true>
|
||||||
|
>;
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
typedef typename ZCBaseList::ZCLink ZCLink;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
_VT_ ZCLink* NewLink()
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx10 : NewLink()"<<endl;
|
||||||
|
|
||||||
|
return new ZCLink;
|
||||||
|
}/*
|
||||||
|
_VT_ ZCLink* NewLink()*/
|
||||||
|
|
||||||
|
_VT_ ZCLink* NewLink(CStringBase& AO_ArgData)
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx10 : NewLink(TypeArg)"<<endl;
|
||||||
|
|
||||||
|
return new ZCLink(AO_ArgData);
|
||||||
|
}/*
|
||||||
|
_VT_ ZCLink* NewLink(CStringBase& AO_ArgData)*/
|
||||||
|
|
||||||
|
_VT_ void DelLink(ZCLink* AP_DelLink)
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx10 : DelLink(ZCLink*)"<<endl;
|
||||||
|
|
||||||
|
delete AP_DelLink;
|
||||||
|
}/*
|
||||||
|
_VT_ void DelLink(ZCLink* AP_DelLink)*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
};/*
|
||||||
|
class ZCBaseListEx10 : public ZtCBaseList*/
|
||||||
|
|
||||||
|
|
||||||
|
class ZCBaseListEx11 : public ZtCBaseList
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx11, false>
|
||||||
|
>
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
|
||||||
|
template //////////////////////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
typename TType , typename TTypArgu ,
|
||||||
|
typename TTypeAlloc , typename TTypSize ,
|
||||||
|
typename TMoveObj , typename TTypeCRTP
|
||||||
|
>
|
||||||
|
friend class ZtCBaseList; /*#############################################*/
|
||||||
|
|
||||||
|
typedef ZtCBaseList ///////////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx11, false>
|
||||||
|
>
|
||||||
|
ZCBaseList; ///////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
friend class ZtCBaseList //////////////////////////////////////////////////
|
||||||
|
<
|
||||||
|
CStringBase
|
||||||
|
, CStringBase&
|
||||||
|
, ZCAllocator
|
||||||
|
, ZTypLong
|
||||||
|
, ZNsMain::ZtCMoveObj <CStringBase, CStringBase&, true>
|
||||||
|
, ZNsType::ZtCTypeCRTP<ZCBaseListEx11, false>
|
||||||
|
>;
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
typedef typename ZCBaseList::ZCLink ZCLink;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
_VT_ ZCLink* NewLink()
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx11 : NewLink()"<<endl;
|
||||||
|
|
||||||
|
return new ZCLink;
|
||||||
|
}/*
|
||||||
|
_VT_ ZCLink* NewLink()*/
|
||||||
|
|
||||||
|
_VT_ ZCLink* NewLink(CStringBase& AO_ArgData)
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx11 : NewLink(TypeArg)"<<endl;
|
||||||
|
|
||||||
|
return new ZCLink(AO_ArgData);
|
||||||
|
}/*
|
||||||
|
_VT_ ZCLink* NewLink(CStringBase& AO_ArgData)*/
|
||||||
|
|
||||||
|
_VT_ void DelLink(ZCLink* AP_DelLink)
|
||||||
|
{
|
||||||
|
cout<<"** ZCBaseListEx11 : DelLink(ZCLink*)"<<endl;
|
||||||
|
|
||||||
|
delete AP_DelLink;
|
||||||
|
}/*
|
||||||
|
_VT_ void DelLink(ZCLink* AP_DelLink)*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
};/*
|
||||||
|
class ZCBaseListEx11 : public ZtCBaseList*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ShowDataInNode(const CStringBase& AR_Data)
|
static void ShowDataInNode(const CStringBase& AR_Data)
|
||||||
{
|
{
|
||||||
@ -149,6 +301,16 @@ namespace ZNsMain
|
|||||||
VO_CIntList.IterElement(StFunctor5::ShowElement, ZftMCP(VO_CHelpObj), ZftMCP(VO_CHelpObj) );
|
VO_CIntList.IterElement(StFunctor5::ShowElement, ZftMCP(VO_CHelpObj), ZftMCP(VO_CHelpObj) );
|
||||||
VO_CIntList.IterElement(StFunctor6::ShowElement, ZftMCP(VO_CHelpObj), VO_CHelpObj );
|
VO_CIntList.IterElement(StFunctor6::ShowElement, ZftMCP(VO_CHelpObj), VO_CHelpObj );
|
||||||
|
|
||||||
|
|
||||||
|
ZCBaseListEx10 VO_ZCBaseListEx10;
|
||||||
|
ZCBaseListEx11 VO_ZCBaseListEx11;
|
||||||
|
|
||||||
|
VO_ZCBaseListEx10.AddTail(VO_CStringBase("data ex 11-1"));
|
||||||
|
VO_ZCBaseListEx10.AddTail(VO_CStringBase("data ex 11-2"));
|
||||||
|
|
||||||
|
VO_ZCBaseListEx11.AddTail(VO_CStringBase("data ex 11-1"));
|
||||||
|
VO_ZCBaseListEx11.AddTail(VO_CStringBase("data ex 11-2"));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}/*
|
}/*
|
||||||
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/
|
||||||
|
Reference in New Issue
Block a user