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
|
template< typename TDataNow, typename TTypeNextChain
|
||||||
>
|
>
|
||||||
class ZtCTypeChain ///////////////////////////////////
|
class ZtCTypeChain ///////////////////////////////////
|
||||||
@ -3650,6 +3733,26 @@ namespace ZNsMain
|
|||||||
|
|
||||||
-- 2025-10-22 19:41
|
-- 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 을 추가해,
|
■ ZtCObjtChain<TDataNow, ZCEmpty>::TypeChainLast 을 추가해,
|
||||||
|
|
||||||
마지막 TypeChainNext 즉 마지막 TypeChainNow
|
마지막 TypeChainNext 즉 마지막 TypeChainNow
|
||||||
@ -3734,6 +3837,13 @@ namespace ZNsMain
|
|||||||
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
||||||
cout<<"************************************"<<endl;
|
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 /*########################################################*/
|
template /*########################################################*/
|
||||||
@ -3772,14 +3882,14 @@ namespace ZNsMain
|
|||||||
TypeDataC& operator* () const{return mo_TypeVar;}
|
TypeDataC& operator* () const{return mo_TypeVar;}
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
TypeChainNext & GetChainNext()
|
TypeChainNext & GetChainNext()
|
||||||
{ return static_cast<TypeChainNext&>(*this); }
|
{ return static_cast<TypeChainNext &>(*this); }
|
||||||
TypeChainNextC& GetChainNext() const
|
TypeChainNextC& GetChainNext() const
|
||||||
{ return static_cast<TypeChainNext&>(*this); }
|
{ return static_cast<TypeChainNextC&>(*this); }
|
||||||
|
|
||||||
TypeChainNext & operator() ()
|
TypeChainNext & operator() ()
|
||||||
{ return static_cast<TypeChainNext&>(*this); }
|
{ return static_cast<TypeChainNext &>(*this); }
|
||||||
TypeChainNextC& operator() () const
|
TypeChainNextC& operator() () const
|
||||||
{ return static_cast<TypeChainNext&>(*this); }
|
{ return static_cast<TypeChainNextC&>(*this); }
|
||||||
|
|
||||||
template<typename TDataHere>
|
template<typename TDataHere>
|
||||||
TypeChainNow & operator= (const TDataHere& AR_Data)
|
TypeChainNow & operator= (const TDataHere& AR_Data)
|
||||||
@ -3787,7 +3897,25 @@ namespace ZNsMain
|
|||||||
TypeChainNow & operator= (const TypeData & AR_Data)
|
TypeChainNow & operator= (const TypeData & AR_Data)
|
||||||
{ mo_TypeVar=AR_Data; return *this;}
|
{ 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>
|
template<int TTypNo, typename TDataHere>
|
||||||
bool SetDataRecur(const TDataHere& AR_Data)
|
bool SetDataRecur(const TDataHere& AR_Data)
|
||||||
@ -3937,6 +4065,20 @@ namespace ZNsMain
|
|||||||
{ mo_TypeVar=AR_Data; return *this;}
|
{ 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>
|
template<int TTypNo, typename TDataHere>
|
||||||
bool SetDataRecur(const TDataHere& AR_Data)
|
bool SetDataRecur(const TDataHere& AR_Data)
|
||||||
{
|
{
|
||||||
@ -3993,83 +4135,27 @@ namespace ZNsMain
|
|||||||
class ZtCObjtChain<TDataNow, ZCEmpty> /////////////////////////////*/
|
class ZtCObjtChain<TDataNow, ZCEmpty> /////////////////////////////*/
|
||||||
|
|
||||||
|
|
||||||
|
template<typename TDataNow, typename TTypeNextChain> std::ostream& operator<<
|
||||||
/*###################################################################
|
(
|
||||||
|
std::ostream& AR_COStream, const ZtCObjtChain
|
||||||
■ template<typename TDataChain, int TInIndexNo> class ZtCTypeByNo
|
<TDataNow, TTypeNextChain>& AR_CChain
|
||||||
|
)
|
||||||
ZtCTypeChain, ZtCObjtChain 등을 template 인자로 받아, 어떤 index
|
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
||||||
숫자로부터 type 을 알 수 있게 한다. index 는 0 부터 시작한다.
|
{
|
||||||
|
AR_COStream<<AR_CChain.GetData();
|
||||||
이러면 ZtCObjtChain 의 활용성이 점점 높어지는 것이다. -- 2025-10-23 19:47
|
|
||||||
|
|
||||||
■ 예제 -- 2025-10-23 19:55
|
|
||||||
|
|
||||||
typedef ZtCObjtChain
|
typedef ZtCObjtChain
|
||||||
<
|
<TDataNow, TTypeNextChain> TypeObjtChain;
|
||||||
char , ZtCObjtChain<
|
|
||||||
string, ZtCObjtChain<
|
|
||||||
double, ZtCObjtChain<
|
|
||||||
int ,
|
|
||||||
ZCEmpty > > >
|
|
||||||
> ZCObjtChain; ZCObjtChain VO_ZCObjtChain;
|
|
||||||
|
|
||||||
VO_ZCObjtChain.GetChainNext().GetData()="abc";
|
if(TypeObjtChain::ZEBoolNext>0)
|
||||||
*VO_ZCObjtChain ='Z' ;
|
{
|
||||||
*VO_ZCObjtChain() ="New Str";
|
cout<<", "; return AR_COStream<<AR_CChain.GetChainNext() ;
|
||||||
*VO_ZCObjtChain()() =0.8 ;
|
}/*
|
||||||
*VO_ZCObjtChain()()() =1234 ;
|
if(TypeObjtChain::ZEBoolNext>0)*/
|
||||||
VO_ZCObjtChain.IterHead(VO_ZCTypeView);
|
|
||||||
|
|
||||||
typedef ZtCTypeByNo<ZCObjtChain, 0>::TypeData TypeDataHere0 ;
|
return AR_COStream;
|
||||||
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:
|
|
||||||
};/*
|
|
||||||
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -215,10 +215,18 @@ namespace ZNsMain
|
|||||||
VO_ZCObjtChain.SetDataRecur<4>('D');
|
VO_ZCObjtChain.SetDataRecur<4>('D');
|
||||||
VO_ZCObjtChain.SetDataRecur<3>(string("New3 Str"));
|
VO_ZCObjtChain.SetDataRecur<3>(string("New3 Str"));
|
||||||
VO_ZCObjtChain.SetDataRecur<2>(0.8);
|
VO_ZCObjtChain.SetDataRecur<2>(0.8);
|
||||||
VO_ZCObjtChain.SetDataRecur<1>(9999);
|
VO_ZCObjtChain.SetDataRecur<1>(9990);
|
||||||
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
VO_ZCObjtChain.IterHead(ZftMCP(VO_ZCTypeView));
|
||||||
cout<<"************************************"<<endl;
|
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, 0>::TypeData TypeDataHere0 ;
|
||||||
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeData TypeDataHere1 ;
|
typedef ZtCTypeByNo<ZCObjtChain, 1>::TypeData TypeDataHere1 ;
|
||||||
|
|||||||
Reference in New Issue
Block a user