commit 2025-10-24 21:16 add ZtCObjtChain::GetChainByNo() in ZCppMain/ZMainHead.H

This commit is contained in:
2025-10-24 21:16:51 +09:00
parent 2ad1e47820
commit 200b8583fc
2 changed files with 173 additions and 79 deletions

View File

@ -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);
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
if(TypeObjtChain::ZEBoolNext>0)
{
public:
typedef ZtCTypeByNo /*++++++++++++++++++++++++++++++++*/
<
typename TDataChain::TypeChainNext, TInIndexNo-1
>
ZCTypeByNoNext ; /*+++++++++++++++++++++++++++++++++++*/
cout<<", "; return AR_COStream<<AR_CChain.GetChainNext() ;
}/*
if(TypeObjtChain::ZEBoolNext>0)*/
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;
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

View File

@ -215,10 +215,18 @@ namespace ZNsMain
VO_ZCObjtChain.SetDataRecur<4>('D');
VO_ZCObjtChain.SetDataRecur<3>(string("New3 Str"));
VO_ZCObjtChain.SetDataRecur<2>(0.8);
VO_ZCObjtChain.SetDataRecur<1>(9999);
VO_ZCObjtChain.SetDataRecur<1>(9990);
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<<"#VO_ZCObjtChain = "<<VO_ZCObjtChain<<endl;
cout<<"************************************"<<endl;
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeData TypeDataHere0 ;
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeData TypeDataHere1 ;