commit 2025-09-28 17:19 add template parameter 'bool TTypebUseCRTP' inZtCTypeNowCRTP : ZCppMain/ZMainHead.H

This commit is contained in:
2025-09-28 17:19:34 +09:00
parent c617e6ea8a
commit 286259df9d
2 changed files with 236 additions and 31 deletions

View File

@ -1243,7 +1243,7 @@ namespace ZNsMain
//////////////////////////////////////////////////////////////////////////////////////////*/
/*/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*#########################################################################################
■ class ZtCTypeCRTP<> 의 단점은 상속하지 않은 class 형은 알 수 없는데, 이것을 알아내기 위해
@ -1275,30 +1275,65 @@ namespace ZNsMain
정말 멋진 기교가 아닌가. C++ 의 향기에 잠시 취해 보자. -- 2013-06-10 00:33:00
/////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
■ ZtCTypeNowCRTP 의 template parameter 에 bool TTypebUseCRTP 추가. -- 2025-09-28 15:55
template<typename TTypeNow, typename TTypeChild>
class ZtCTypeNowCRTP
{
public: enum{ZEUseCRTP=1};
public: typedef TTypeChild TypeData;
public: typedef TTypeNow TypeBase;
};
template<typename TTypeNow>
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty>
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
template<typename TTypeNow>
class ZtCTypeNowCRTP<TTypeNow, void >
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
////////////////////////////////////////////////
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
{
public: enum{ZEUseCRTP=(ZTypIntE)TTypebUseCRTP};
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
public: typedef TTypeChild TypeData;
public: typedef TTypeNow TypeBase;
};
template
<typename TTypeNow, typename TTypeChild>
class ZtCTypeNowCRTP<TTypeNow, TTypeChild, false /*++*/ >
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
public: typedef TTypeNow TypeBase;
};
template
<typename TTypeNow, bool TTypebUseCRTP>
class ZtCTypeNowCRTP<TTypeNow, ZCEmpty , TTypebUseCRTP>
{
public: enum{ZEUseCRTP=0};
public: typedef TTypeNow TypeData;
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 ;
public:
typedef ZNsType::ZtCTypeNowCRTP ///////////////////
typedef ZNsType::ZtCTypeNowCRTP ///////////////////////////////////////
<
ZtCBaseList, typename TTypeCRTP::TypeData
ZtCBaseList, typename TTypeCRTP::TypeData, TTypeCRTP::ZEUseCRTP
>
ZCTypeNowCRTP ; ///////////////////////////////////
ZCTypeNowCRTP ; ///////////////////////////////////////////////////////
typedef typename ZCTypeNowCRTP::TypeData TypeChild;
@ -5355,11 +5390,19 @@ namespace ZNsMain
TypeSize ml_LinkCnt ;
private :
TypeChild& GetChildObj()
{
return *static_cast<TypeChild*>(this);
}/*
TypeChild& GetChildObj()*/
private :
_VT_ ZCLink* NewLink()
{
if(TTypeCRTP::ZEUseCRTP<1) return new ZCLink;
return (*static_cast<TypeChild*>(this)).NewLink();
return GetChildObj().NewLink();
}/*
_VT_ ZCLink* NewLink()*/
@ -5368,7 +5411,7 @@ namespace ZNsMain
if(TTypeCRTP::ZEUseCRTP<1)
{ return new ZCLink(AO_ArgData); }
return (*static_cast<TypeChild*>(this)).NewLink(AO_ArgData);
return GetChildObj().NewLink(AO_ArgData);
}/*
_VT_ ZCLink* NewLink(TypeArg AO_ArgData)*/
@ -5377,7 +5420,7 @@ namespace ZNsMain
if(TTypeCRTP::ZEUseCRTP<1)
{ delete AP_DelLink; return; }
return (*static_cast<TypeChild*>(this)).DelLink(AP_DelLink);
GetChildObj().DelLink(AP_DelLink);
}/*
_VT_ void DelLink(ZCLink* AP_DelLink)*/

View File

@ -67,7 +67,6 @@ namespace ZNsMain
{cout<<"#6 Value="<<ArgiValue<<", HelpObj Ptr="<<&AR_CHelpObj<<" With CHelpObj Half Ref"<<endl;}
};
public:
typedef ZtCStringBase<char> CStringBase ;
@ -84,6 +83,159 @@ namespace ZNsMain
typedef ZtCBaseList
<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)
{
@ -149,6 +301,16 @@ namespace ZNsMain
VO_CIntList.IterElement(StFunctor5::ShowElement, ZftMCP(VO_CHelpObj), ZftMCP(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;
}/*
static int Main(int AI_ArgCnt=0, char* APP_ArgVal[]=0)*/