commit 2025-10-24 21:16 add ZtCObjtChain::GetChainByNo() in ZCppMain/ZMainHead.H
This commit is contained in:
@ -3261,6 +3261,89 @@ namespace ZNsMain
|
||||
|
||||
|
||||
|
||||
/*###################################################################
|
||||
|
||||
■ template<typename TDataChain, int TInIndexNo> class ZtCTypeByNo
|
||||
|
||||
ZtCTypeChain, ZtCObjtChain 등을 template 인자로 받아, 어떤 index
|
||||
숫자로부터 type 을 알 수 있게 한다. index 는 0 부터 시작한다.
|
||||
|
||||
이러면 ZtCObjtChain 의 활용성이 점점 높어지는 것이다. -- 2025-10-23 19:47
|
||||
|
||||
■ 예제 -- 2025-10-23 19:55
|
||||
|
||||
typedef ZtCObjtChain
|
||||
<
|
||||
char , ZtCObjtChain<
|
||||
string, ZtCObjtChain<
|
||||
double, ZtCObjtChain<
|
||||
int ,
|
||||
ZCEmpty > > >
|
||||
> ZCObjtChain; ZCObjtChain VO_ZCObjtChain;
|
||||
|
||||
VO_ZCObjtChain.GetChainNext().GetData()="abc";
|
||||
*VO_ZCObjtChain ='Z' ;
|
||||
*VO_ZCObjtChain() ="New Str";
|
||||
*VO_ZCObjtChain()() =0.8 ;
|
||||
*VO_ZCObjtChain()()() =1234 ;
|
||||
VO_ZCObjtChain.IterHead(VO_ZCTypeView);
|
||||
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeData TypeDataHere0 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeData TypeDataHere1 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 2>::TypeData TypeDataHere2 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 3>::TypeData TypeDataHere3 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 4>::TypeData TypeDataHere4 ;
|
||||
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeChain TypeChainHere0;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeChain TypeChainHere1;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 2>::TypeChain TypeChainHere2;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 3>::TypeChain TypeChainHere3;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 4>::TypeChain TypeChainHere4;
|
||||
|
||||
cout<<"# TypeDataHere0 ="<<typeid(TypeDataHere0 ).name()<<endl;
|
||||
cout<<"# TypeDataHere1 ="<<typeid(TypeDataHere1 ).name()<<endl;
|
||||
cout<<"# TypeDataHere2 ="<<typeid(TypeDataHere2 ).name()<<endl;
|
||||
cout<<"# TypeDataHere3 ="<<typeid(TypeDataHere3 ).name()<<endl;
|
||||
cout<<"# TypeDataHere4 ="<<typeid(TypeDataHere4 ).name()<<endl;
|
||||
|
||||
cout<<"# TypeChainHere0="<<typeid(TypeChainHere0).name()<<endl;
|
||||
cout<<"# TypeChainHere1="<<typeid(TypeChainHere1).name()<<endl;
|
||||
cout<<"# TypeChainHere2="<<typeid(TypeChainHere2).name()<<endl;
|
||||
cout<<"# TypeChainHere3="<<typeid(TypeChainHere3).name()<<endl;
|
||||
cout<<"# TypeChainHere4="<<typeid(TypeChainHere4).name()<<endl;
|
||||
|
||||
###################################################################*/
|
||||
|
||||
template<typename TDataChain, int TInIndexNo> class ZtCTypeByNo
|
||||
{
|
||||
public:
|
||||
typedef ZtCTypeByNo /*++++++++++++++++++++++++++++++++*/
|
||||
<
|
||||
typename TDataChain::TypeChainNext, TInIndexNo-1
|
||||
>
|
||||
ZCTypeByNoNext ; /*+++++++++++++++++++++++++++++++++++*/
|
||||
|
||||
typedef typename ZCTypeByNoNext::TypeData TypeData ;
|
||||
typedef typename ZCTypeByNoNext::TypeDataC TypeDataC ;
|
||||
typedef typename ZCTypeByNoNext::TypeChain TypeChain ;
|
||||
typedef typename ZCTypeByNoNext::TypeChainC TypeChainC;
|
||||
public:
|
||||
};/*
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
template<typename TDataChain> class ZtCTypeByNo<TDataChain, 0>
|
||||
{
|
||||
public:
|
||||
typedef /*----*/ TDataChain /*----*/ TypeChain ;
|
||||
typedef const TDataChain /*----*/ TypeChainC;
|
||||
typedef typename TDataChain::TypeData TypeData ;
|
||||
typedef typename TDataChain::TypeDataC TypeDataC ;
|
||||
public:
|
||||
};/*
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
|
||||
|
||||
template< typename TDataNow, typename TTypeNextChain
|
||||
>
|
||||
class ZtCTypeChain ///////////////////////////////////
|
||||
@ -3650,6 +3733,26 @@ namespace ZNsMain
|
||||
|
||||
-- 2025-10-22 19:41
|
||||
|
||||
ZtCTypeByNo 를 만들고 ZtCObjtChain 에 아래 멤버도 추가하고
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo() const
|
||||
|
||||
아래 예제 코드를 추가.
|
||||
|
||||
*VO_ZCObjtChain.GetChainByNo<0>()=('E');
|
||||
*VO_ZCObjtChain.GetChainByNo<1>()=(string("New4 Str"));
|
||||
*VO_ZCObjtChain.GetChainByNo<2>()=(1.8);
|
||||
*VO_ZCObjtChain.GetChainByNo<3>()=(9999);
|
||||
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
||||
cout<<"************************************"<<endl;
|
||||
|
||||
보라! 각 객체에 깔끔하게 접근하고 있지 않는가... 고마운지고!!
|
||||
|
||||
-- 2025-10-24 09:09
|
||||
|
||||
■ ZtCObjtChain<TDataNow, ZCEmpty>::TypeChainLast 을 추가해,
|
||||
|
||||
마지막 TypeChainNext 즉 마지막 TypeChainNow
|
||||
@ -3734,6 +3837,13 @@ namespace ZNsMain
|
||||
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
||||
cout<<"************************************"<<endl;
|
||||
|
||||
*VO_ZCObjtChain.GetChainByNo<0>()=('E');
|
||||
*VO_ZCObjtChain.GetChainByNo<1>()=(string("New4 Str"));
|
||||
*VO_ZCObjtChain.GetChainByNo<2>()=(1.8);
|
||||
*VO_ZCObjtChain.GetChainByNo<3>()=(9999);
|
||||
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
||||
cout<<"************************************"<<endl;
|
||||
|
||||
///////////////////////////////////////////////////////////////////*/
|
||||
|
||||
template /*########################################################*/
|
||||
@ -3772,14 +3882,14 @@ namespace ZNsMain
|
||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||
/************************************************************/
|
||||
TypeChainNext & GetChainNext()
|
||||
{ return static_cast<TypeChainNext&>(*this); }
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& GetChainNext() const
|
||||
{ return static_cast<TypeChainNext&>(*this); }
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
TypeChainNext & operator() ()
|
||||
{ return static_cast<TypeChainNext&>(*this); }
|
||||
{ return static_cast<TypeChainNext &>(*this); }
|
||||
TypeChainNextC& operator() () const
|
||||
{ return static_cast<TypeChainNext&>(*this); }
|
||||
{ return static_cast<TypeChainNextC&>(*this); }
|
||||
|
||||
template<typename TDataHere>
|
||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||
@ -3787,7 +3897,25 @@ namespace ZNsMain
|
||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
|
||||
/************************************************************/
|
||||
/**************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain TypeChain ;
|
||||
|
||||
return *static_cast<TypeChain *>(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
typedef typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC TypeChainC;
|
||||
|
||||
return *static_cast<TypeChainC*>(this);
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
@ -3937,6 +4065,20 @@ namespace ZNsMain
|
||||
{ mo_TypeVar=AR_Data; return *this;}
|
||||
/************************************************************/
|
||||
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChain & GetChainByNo()
|
||||
{
|
||||
return *(this);
|
||||
}
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
{
|
||||
return *(this);
|
||||
}/*
|
||||
template<int TInTypeNo> typename ZtCTypeByNo
|
||||
<TypeChainNow, TInTypeNo>::TypeChainC& GetChainByNo() const
|
||||
*/
|
||||
|
||||
template<int TTypNo, typename TDataHere>
|
||||
bool SetDataRecur(const TDataHere& AR_Data)
|
||||
{
|
||||
@ -3993,83 +4135,27 @@ namespace ZNsMain
|
||||
class ZtCObjtChain<TDataNow, ZCEmpty> /////////////////////////////*/
|
||||
|
||||
|
||||
|
||||
/*###################################################################
|
||||
|
||||
■ template<typename TDataChain, int TInIndexNo> class ZtCTypeByNo
|
||||
|
||||
ZtCTypeChain, ZtCObjtChain 등을 template 인자로 받아, 어떤 index
|
||||
숫자로부터 type 을 알 수 있게 한다. index 는 0 부터 시작한다.
|
||||
|
||||
이러면 ZtCObjtChain 의 활용성이 점점 높어지는 것이다. -- 2025-10-23 19:47
|
||||
|
||||
■ 예제 -- 2025-10-23 19:55
|
||||
template<typename TDataNow, typename TTypeNextChain> std::ostream& operator<<
|
||||
(
|
||||
std::ostream& AR_COStream, const ZtCObjtChain
|
||||
<TDataNow, TTypeNextChain>& AR_CChain
|
||||
)
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
{
|
||||
AR_COStream<<AR_CChain.GetData();
|
||||
|
||||
typedef ZtCObjtChain
|
||||
<
|
||||
char , ZtCObjtChain<
|
||||
string, ZtCObjtChain<
|
||||
double, ZtCObjtChain<
|
||||
int ,
|
||||
ZCEmpty > > >
|
||||
> ZCObjtChain; ZCObjtChain VO_ZCObjtChain;
|
||||
<TDataNow, TTypeNextChain> TypeObjtChain;
|
||||
|
||||
VO_ZCObjtChain.GetChainNext().GetData()="abc";
|
||||
*VO_ZCObjtChain ='Z' ;
|
||||
*VO_ZCObjtChain() ="New Str";
|
||||
*VO_ZCObjtChain()() =0.8 ;
|
||||
*VO_ZCObjtChain()()() =1234 ;
|
||||
VO_ZCObjtChain.IterHead(VO_ZCTypeView);
|
||||
if(TypeObjtChain::ZEBoolNext>0)
|
||||
{
|
||||
cout<<", "; return AR_COStream<<AR_CChain.GetChainNext() ;
|
||||
}/*
|
||||
if(TypeObjtChain::ZEBoolNext>0)*/
|
||||
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeData TypeDataHere0 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeData TypeDataHere1 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 2>::TypeData TypeDataHere2 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 3>::TypeData TypeDataHere3 ;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 4>::TypeData TypeDataHere4 ;
|
||||
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeChain TypeChainHere0;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeChain TypeChainHere1;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 2>::TypeChain TypeChainHere2;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 3>::TypeChain TypeChainHere3;
|
||||
typedef ZtCTypeByNo<ZCObjtChain, 4>::TypeChain TypeChainHere4;
|
||||
|
||||
cout<<"# TypeDataHere0 ="<<typeid(TypeDataHere0 ).name()<<endl;
|
||||
cout<<"# TypeDataHere1 ="<<typeid(TypeDataHere1 ).name()<<endl;
|
||||
cout<<"# TypeDataHere2 ="<<typeid(TypeDataHere2 ).name()<<endl;
|
||||
cout<<"# TypeDataHere3 ="<<typeid(TypeDataHere3 ).name()<<endl;
|
||||
cout<<"# TypeDataHere4 ="<<typeid(TypeDataHere4 ).name()<<endl;
|
||||
|
||||
cout<<"# TypeChainHere0="<<typeid(TypeChainHere0).name()<<endl;
|
||||
cout<<"# TypeChainHere1="<<typeid(TypeChainHere1).name()<<endl;
|
||||
cout<<"# TypeChainHere2="<<typeid(TypeChainHere2).name()<<endl;
|
||||
cout<<"# TypeChainHere3="<<typeid(TypeChainHere3).name()<<endl;
|
||||
cout<<"# TypeChainHere4="<<typeid(TypeChainHere4).name()<<endl;
|
||||
|
||||
###################################################################*/
|
||||
|
||||
template<typename TDataChain, int TInIndexNo> class ZtCTypeByNo
|
||||
{
|
||||
public:
|
||||
typedef ZtCTypeByNo /*++++++++++++++++++++++++++++++++*/
|
||||
<
|
||||
typename TDataChain::TypeChainNext, TInIndexNo-1
|
||||
>
|
||||
ZCTypeByNoNext ; /*+++++++++++++++++++++++++++++++++++*/
|
||||
|
||||
typedef typename ZCTypeByNoNext::TypeData TypeData ;
|
||||
typedef typename ZCTypeByNoNext::TypeChain TypeChain;
|
||||
public:
|
||||
};/*
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
template<typename TDataChain> class ZtCTypeByNo<TDataChain, 0>
|
||||
{
|
||||
public:
|
||||
typedef /*----*/ TDataChain /*----*/ TypeChain;
|
||||
typedef typename TDataChain::TypeData TypeData ;
|
||||
public:
|
||||
};/*
|
||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
return AR_COStream;
|
||||
}
|
||||
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user