From b7d7ddca2bf2607bda7d9456a67c2ce6be79629e Mon Sep 17 00:00:00 2001 From: sauron Date: Sat, 25 Oct 2025 13:35:43 +0900 Subject: [PATCH] commit 2025-10-25 13:35 add ZtCObjtInitChain in ZCppMain/ZMainHead.H --- ZCppMain/ZMainHead.H | 790 +++++++++++++++++++++++++++++++++++++++++- ZCppMainTest/c++_test_006.cpp | 27 +- 2 files changed, 800 insertions(+), 17 deletions(-) diff --git a/ZCppMain/ZMainHead.H b/ZCppMain/ZMainHead.H index 0158cf4..e6be40d 100644 --- a/ZCppMain/ZMainHead.H +++ b/ZCppMain/ZMainHead.H @@ -817,21 +817,40 @@ namespace ZNsMain template int ZftPrint(const TDataNow& AR_Data) { - #if defined(_DEBUG_LEVEL) && _DEBUG_LEVEL>=100 - cout<<"# typename TDataNow : "< int ZftPrint(const TDataNow& AR_Data)*/ - template int ZftPrint + template int ZftPrint2 (const TDataNow1& AR_Data1, const TDataNow2& AR_Data2) { std::cout< int ZftPrint2(~) + + 만약 위 선언을 template int ZftPrint(~) 로 하면 어떻게 될까. + 별로 좋지 않다. 아래 표현에서 + + void* myP = &ZftPrint ; + + 아래 함수와 overload 가 이상해져서, + + template + int ZftPrint + ( const ZtCObjtChain&); + template + int ZftPrint + ( const ZtCObjtInitChain& AR_CChain ) + + 적절한 함수를 찾지를 못한다. -- 2025-10-25 13:32 + + ///////////////////////////////////////////////////////////////////////////////*/ + + /*/////////////////////////////////////////////////////////////////////////////// @@ -842,8 +861,6 @@ namespace ZNsMain ZtCObjtChain 의 원소를 순회할 때마다 변한다. 그래서 ZCPrint 처럼, 템플릿 함수 연산자 () 을 갖는 ZCPrint 가 필요하다. - ZtCObjtInitChain 에서 사용될 수 있다. -- 2025-10-25 08:27 - ///////////////////////////////////////////////////////////////////////////////*/ class ZCPrint /*///////////////////////////////////////////////////////////////*/ @@ -851,7 +868,7 @@ namespace ZNsMain public: template int operator () (const TDataNow& AR_Data){ ZftPrint(AR_Data); return 0; } - template int OnPrevIter + template int OnNextIter (const TDataNow& AR_Data){ ZftPrint(", ") ; return 0; } public: }; @@ -859,17 +876,22 @@ namespace ZNsMain - int ZfInitZero(){ return 0; } /*/////////////////////////////////////////////////////////////////////////////// - ■ int ZfInitZero() + ■ class ZCInitZero - 템플릿 인자 중에서, 0 으로 초기화하는 functor 가 필요할 때 사용하는 함수. + 템플릿 인자 중에서, 0 으로 초기화하는 자료형이 필요할 때 사용하는 함수. ZtCObjtInitChain 에서 사용될 수 있다. -- 2025-10-25 08:27 ///////////////////////////////////////////////////////////////////////////////*/ + class ZCInitZero + { + public: static int Exec(){ return 0; } + };/* + class ZCInitZero*/ + class ZCEndian @@ -3735,9 +3757,26 @@ namespace ZNsMain 각 객체에 어떻게 쉽게 접근하는지가 관건이다. -- 2025-10-18 01:41 + 현재 각 객체에 아래처럼 갈끔하게 접근하고 있다. + + *VO_ZCObjtChain.GetChainByNo<0>()=('E'); + *VO_ZCObjtChain.GetChainByNo<1>()=(string("New4 Str")); + *VO_ZCObjtChain.GetChainByNo<2>()=(1.8); + *VO_ZCObjtChain.GetChainByNo<3>()=(9999); + + 여기에 오기까지 참 한 많은 세월이 아니던가... -- 2025-10-25 10:46 + + ********************************************************************* + () 을 재정의해서, () 을 필요한 만큼 겹겹이 호출해서 접근하도록 했다. 아래 예제:202510200053 참고. + ■ class ZtCObjtInitChain + + 각 원소 TDataNow 객체를 TInitVal::Exec() 로 초기화한다. + + -- 2025-10-25 11:02 + ■ 아래 멈버 함수를 추가하고 template @@ -3797,7 +3836,7 @@ namespace ZNsMain -- 2025-10-24 09:09 - ZtCPrint 를 추가해서, 멤버함수 IterElement(), IterElemRev() 이 + ZCPrint 를 추가해서, 멤버함수 IterElement(), IterElemRev() 이 functor 를 받을 수 있도록 했다. 이러니까 C++ 이다! -- 2025-10-25 08:40 @@ -4064,7 +4103,7 @@ namespace ZNsMain if(TypeChainNow::ZEBoolNext>0) { ZtCTypeData:: - GetObjRef(AO_CView).OnPrevIter(*this); + GetObjRef(AO_CView).OnNextIter(*this); this->TypeChainNext::IterElement(AO_CView); }/* @@ -4078,7 +4117,7 @@ namespace ZNsMain this->TypeChainNext::IterElemRev(AO_CView); ZtCTypeData:: - GetObjRef(AO_CView).OnPrevIter(*this); + GetObjRef(AO_CView).OnNextIter(*this); }/* if(TypeChainNow::ZEBoolNext>0)*/ @@ -4232,8 +4271,707 @@ namespace ZNsMain + /*/////////////////////////////////////////////////////////////////// + + ■ class ZtCObjtInitChain + + 각 원소 TDataNow 객체를 TInitVal::Exec() 로 초기화한다. + + -- 2025-10-25 11:02 + + ///////////////////////////////////////////////////////////////////*/ + + template /*########################################################*/ + < + typename TDataNow, typename TInitVal, typename TTypeNextChain + > + class ZtCObjtInitChain : public TTypeNextChain ////////////////////// + { + public : + typedef TDataNow TypeData ; + typedef ZtCObjtInitChain TypeChainNow ; + typedef TTypeNextChain TypeChainNext ; + typedef TInitVal TypeInitVal ; + /************************************************************/ + typedef const TypeChainNow TypeChainNowC ; + typedef const TypeChainNext TypeChainNextC; + /************************************************************/ + typedef const TypeData TypeDataC ; + /************************************************************/ + typedef typename TypeChainNext::TypeData TypeNext ; + /************************************************************/ + enum{ZETypeNo = TypeChainNext::ZETypeNo+1}; + enum{ZEBoolNext = 1 }; + public : + static ZTypIntE Size (){return ZETypeNo;} + static ZTypIntE size (){return ZETypeNo;} + static ZTypIntE GetNo(){return ZETypeNo;} + private: + TypeData mo_TypeVar; + public : + ZtCObjtInitChain() : mo_TypeVar( TypeInitVal::Exec() ){} + public : + TypeData & GetData () {return mo_TypeVar;} + TypeDataC& GetData () const{return mo_TypeVar;} + + TypeData & operator* () {return mo_TypeVar;} + TypeDataC& operator* () const{return mo_TypeVar;} + /************************************************************/ + TypeChainNext & GetChainNext() + { return static_cast(*this); } + TypeChainNextC& GetChainNext() const + { return static_cast(*this); } + + TypeChainNext & operator() () + { return static_cast(*this); } + TypeChainNextC& operator() () const + { return static_cast(*this); } + + template + TypeChainNow & operator= (const TDataHere& AR_Data) + { /*:::::::::::::::*/ return *this;} + TypeChainNow & operator= (const TypeData & AR_Data) + { mo_TypeVar=AR_Data; return *this;} + + /**************************************************************/ + + template typename ZtCTypeByNo + ::TypeChain & GetChainByNo() + { + typedef typename ZtCTypeByNo + ::TypeChain TypeChain ; + + return *static_cast(this); + } + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + { + typedef typename ZtCTypeByNo + ::TypeChainC TypeChainC; + + return *static_cast(this); + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + template + bool SetDataRecur(const TDataHere& AR_Data) + { + if(TTypNo==TypeChainNow::ZETypeNo) + {*this=AR_Data; return true;} + if(TTypNo>TypeChainNow::ZETypeNo) + {/*::::::::::*/ return false;} + + return this->TypeChainNext::template + SetDataRecur(AR_Data); + }/* + template + bool SetDataRecur(const TDataHere& AR_Data) */ + + /************************************************************/ + + template typename + TTypeChainNext::TypeData & GetData() + { return this->TTypeChainNext::GetData(); } + template typename + TTypeChainNext::TypeDataC& GetData() const + { return this->TTypeChainNext::GetData(); } + + /* AO_CView.OnMeetData() 은 다음 TypeChainNext 을 호출할 + 때마다 인수 자료형이 변한다. 따라서 고정적인 함수로는 + 적당치 않않다. -- 2025-10-20 00:32 + */ + template void IterHead(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterHead(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template void IterHead(TViewChain AO_CView)*/ + template void IterTail(TViewChain AO_CView) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterTail(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterTail(TViewChain AO_CView)*/ + + + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext:: + IterHead(AO_CView, AO_TypeHelp); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/ + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext:: + IterTail(AO_CView, AO_TypeHelp); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + }/* + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + */ + + template void IterElement(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + + if(TypeChainNow::ZEBoolNext>0) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnNextIter(*this); + + this->TypeChainNext::IterElement(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template void IterElement(TViewChain AO_CView)*/ + template void IterElemRev(TViewChain AO_CView) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterElemRev(AO_CView); + + ZtCTypeData:: + GetObjRef(AO_CView).OnNextIter(*this); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElemRev(TViewChain AO_CView)*/ + + public: + };/* + template ############################################################ + < + typename TDataNow, typename TInitVal, typename TTypeNextChain + > + class ZtCObjtInitChain : public TTypeNextChain ////////////////////*/ + + + template /*########################################################*/ + < + typename TDataNow, typename TTypeNextChain + > + class ZtCObjtInitChain + : public TTypeNextChain ///// + { + public : + typedef ZtCObjtInitChain + ZCObjtInitChain; + public : + typedef TDataNow TypeData ; + typedef ZCObjtInitChain TypeChainNow ; + typedef TTypeNextChain TypeChainNext ; + typedef ZCEmpty TypeInitVal ; + /************************************************************/ + typedef const TypeChainNow TypeChainNowC ; + typedef const TypeChainNext TypeChainNextC; + /************************************************************/ + typedef const TypeData TypeDataC ; + /************************************************************/ + typedef typename TypeChainNext::TypeData TypeNext ; + /************************************************************/ + enum{ZETypeNo = TypeChainNext::ZETypeNo+1}; + enum{ZEBoolNext = 1 }; + public : + static ZTypIntE Size (){return ZETypeNo;} + static ZTypIntE size (){return ZETypeNo;} + static ZTypIntE GetNo(){return ZETypeNo;} + private: + TypeData mo_TypeVar; + public : + ZtCObjtInitChain(){} + public : + TypeData & GetData () {return mo_TypeVar;} + TypeDataC& GetData () const{return mo_TypeVar;} + + TypeData & operator* () {return mo_TypeVar;} + TypeDataC& operator* () const{return mo_TypeVar;} + /************************************************************/ + TypeChainNext & GetChainNext() + { return static_cast(*this); } + TypeChainNextC& GetChainNext() const + { return static_cast(*this); } + + TypeChainNext & operator() () + { return static_cast(*this); } + TypeChainNextC& operator() () const + { return static_cast(*this); } + + template + TypeChainNow & operator= (const TDataHere& AR_Data) + { /*:::::::::::::::*/ return *this;} + TypeChainNow & operator= (const TypeData & AR_Data) + { mo_TypeVar=AR_Data; return *this;} + + /**************************************************************/ + + template typename ZtCTypeByNo + ::TypeChain & GetChainByNo() + { + typedef typename ZtCTypeByNo + ::TypeChain TypeChain ; + + return *static_cast(this); + } + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + { + typedef typename ZtCTypeByNo + ::TypeChainC TypeChainC; + + return *static_cast(this); + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + + template + bool SetDataRecur(const TDataHere& AR_Data) + { + if(TTypNo==TypeChainNow::ZETypeNo) + {*this=AR_Data; return true;} + if(TTypNo>TypeChainNow::ZETypeNo) + {/*::::::::::*/ return false;} + + return this->TypeChainNext::template + SetDataRecur(AR_Data); + }/* + template + bool SetDataRecur(const TDataHere& AR_Data) */ + + /************************************************************/ + + template typename + TTypeChainNext::TypeData & GetData() + { return this->TTypeChainNext::GetData(); } + template typename + TTypeChainNext::TypeDataC& GetData() const + { return this->TTypeChainNext::GetData(); } + + /* AO_CView.OnMeetData() 은 다음 TypeChainNext 을 호출할 + 때마다 인수 자료형이 변한다. 따라서 고정적인 함수로는 + 적당치 않않다. -- 2025-10-20 00:32 + */ + template void IterHead(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterHead(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template void IterHead(TViewChain AO_CView)*/ + template void IterTail(TViewChain AO_CView) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterTail(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterTail(TViewChain AO_CView)*/ + + + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext:: + IterHead(AO_CView, AO_TypeHelp); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp)*/ + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext:: + IterTail(AO_CView, AO_TypeHelp); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + }/* + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + */ + + template void IterElement(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + + if(TypeChainNow::ZEBoolNext>0) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnNextIter(*this); + + this->TypeChainNext::IterElement(AO_CView); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + }/* + template void IterElement(TViewChain AO_CView)*/ + template void IterElemRev(TViewChain AO_CView) + { + if(TypeChainNow::ZEBoolNext>0) + { + this->TypeChainNext::IterElemRev(AO_CView); + + ZtCTypeData:: + GetObjRef(AO_CView).OnNextIter(*this); + }/* + if(TypeChainNow::ZEBoolNext>0)*/ + + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElemRev(TViewChain AO_CView)*/ + + public: + };/* + template ############################################################ + < + typename TDataNow, typename TTypeNextChain + > + class ZtCObjtInitChain ////////*/ + + + template /*########################################################*/ + < typename TDataNow, typename TInitVal> + class ZtCObjtInitChain ///////////////// + { + public : + typedef ZtCObjtInitChain + ZCObjtInitChain; + public : + typedef TDataNow TypeData ; + typedef ZCObjtInitChain TypeChainNow ; + typedef ZCObjtInitChain TypeChainNext ; + /************************************************************/ + typedef ZCObjtInitChain TypeChainLast ; // only here + typedef ZCObjtInitChain TypeChainTail ; + /************************************************************/ + typedef ZCEmpty TypeNext ; + typedef ZCEmpty TypeInitVal ; + /************************************************************/ + typedef const TypeData TypeDataC ; + /************************************************************/ + typedef const TypeChainNow TypeChainNowC ; + typedef const TypeChainNow TypeChainNextC; + /************************************************************/ + enum{ZETypeNo = 1 }; + enum{ZEBoolNext = 0 }; + public : + static ZTypIntE Size (){return ZETypeNo;} + static ZTypIntE size (){return ZETypeNo;} + static ZTypIntE GetNo(){return ZETypeNo;} + private: + TypeData mo_TypeVar; + public : + ZtCObjtInitChain():mo_TypeVar(TInitVal::Exec()){} + public : + TypeData & GetData () {return mo_TypeVar;} + TypeDataC& GetData () const{return mo_TypeVar;} + + TypeData & operator* () {return mo_TypeVar;} + TypeDataC& operator* () const{return mo_TypeVar;} + /************************************************************/ + TypeChainNext & GetChainNext() { return (*this); } + TypeChainNextC& GetChainNext() const{ return (*this); } + + TypeChainNext & operator() () { return (*this); } + TypeChainNextC& operator() () const{ return (*this); } + + template + TypeChainNow & operator= (const TDataHere& AR_Data) + { /*:::::::::::::::*/ return *this;} + TypeChainNow & operator= (const TypeData & AR_Data) + { mo_TypeVar=AR_Data; return *this;} + /************************************************************/ + + template typename ZtCTypeByNo + ::TypeChain & GetChainByNo() + { + return *(this); + } + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + { + return *(this); + }/* + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + */ + + template + bool SetDataRecur(const TDataHere& AR_Data) + { + if(TTypNo==TypeChainNow::ZETypeNo) + {*this=AR_Data; return true ;} + {/*::::::::::*/ return false;} + }/* + template + bool SetDataRecur(const TDataHere& AR_Data) */ + + /************************************************************/ + + template TypeData & GetData() + { return this->GetData(); } + template TypeDataC& GetData() const + { return this->GetData(); } + + template void IterHead(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterHead(TViewChain AO_CView)*/ + template void IterTail(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterTail(TViewChain AO_CView)*/ + + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + } + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + }/* + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + */ + + template void IterElement(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElement(TViewChain AO_CView)*/ + template void IterElemRev(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElemRev(TViewChain AO_CView)*/ + + public: + };/* + template ############################################################ + < typename TDataNow, typename TInitVal> + class ZtCObjtInitChain ///////////////*/ + + + template /*########################################################*/ + < typename TDataNow> + class ZtCObjtInitChain ////////////////// + { + public : + typedef ZtCObjtInitChain + ZCObjtInitChain; + public : + typedef TDataNow TypeData ; + typedef ZCObjtInitChain TypeChainNow ; + typedef ZCObjtInitChain TypeChainNext ; + /************************************************************/ + typedef ZCObjtInitChain TypeChainLast ; // only here + typedef ZCObjtInitChain TypeChainTail ; + /************************************************************/ + typedef ZCEmpty TypeNext ; + /************************************************************/ + typedef const TypeData TypeDataC ; + /************************************************************/ + typedef const TypeChainNow TypeChainNowC ; + typedef const TypeChainNow TypeChainNextC; + /************************************************************/ + enum{ZETypeNo = 1 }; + enum{ZEBoolNext = 0 }; + public : + static ZTypIntE Size (){return ZETypeNo;} + static ZTypIntE size (){return ZETypeNo;} + static ZTypIntE GetNo(){return ZETypeNo;} + private: + TypeData mo_TypeVar; + public : + ZtCObjtInitChain(){} + public : + TypeData & GetData () {return mo_TypeVar;} + TypeDataC& GetData () const{return mo_TypeVar;} + + TypeData & operator* () {return mo_TypeVar;} + TypeDataC& operator* () const{return mo_TypeVar;} + /************************************************************/ + TypeChainNext & GetChainNext() { return (*this); } + TypeChainNextC& GetChainNext() const{ return (*this); } + + TypeChainNext & operator() () { return (*this); } + TypeChainNextC& operator() () const{ return (*this); } + + template + TypeChainNow & operator= (const TDataHere& AR_Data) + { /*:::::::::::::::*/ return *this;} + TypeChainNow & operator= (const TypeData & AR_Data) + { mo_TypeVar=AR_Data; return *this;} + /************************************************************/ + + template typename ZtCTypeByNo + ::TypeChain & GetChainByNo() + { + return *(this); + } + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + { + return *(this); + }/* + template typename ZtCTypeByNo + ::TypeChainC& GetChainByNo() const + */ + + template + bool SetDataRecur(const TDataHere& AR_Data) + { + if(TTypNo==TypeChainNow::ZETypeNo) + {*this=AR_Data; return true ;} + {/*::::::::::*/ return false;} + }/* + template + bool SetDataRecur(const TDataHere& AR_Data) */ + + /************************************************************/ + + template TypeData & GetData() + { return this->GetData(); } + template TypeDataC& GetData() const + { return this->GetData(); } + + template void IterHead(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterHead(TViewChain AO_CView)*/ + template void IterTail(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).OnMeetData(*this); + }/* + template void IterTail(TViewChain AO_CView)*/ + + template + void IterHead(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + } + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + { + typedef ZNsMain::ZtCCheckRef ZCCheckRef; + + ZtCTypeData::GetObjRef(AO_CView). + OnMeetData(*this, ZCCheckRef::PassData(AO_TypeHelp)); + }/* + template + void IterTail(TViewChain AO_CView, TTypeHelp AO_TypeHelp) + */ + + template void IterElement(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElement(TViewChain AO_CView)*/ + template void IterElemRev(TViewChain AO_CView) + { + ZtCTypeData:: + GetObjRef(AO_CView).operator()(*this); + }/* + template void IterElemRev(TViewChain AO_CView)*/ + + public: + };/* + template ############################################################ + < typename TDataNow> + class ZtCObjtInitChain ////////////////*/ + + + template int ZftPrint /*:::::::*/ - ( const ZtCObjtChain& AR_CChain ) + ( const ZtCObjtChain & AR_CChain ) + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + { + return ZftPrint(*AR_CChain); + } + template + int ZftPrint + ( const ZtCObjtInitChain + & AR_CChain + ) /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ { return ZftPrint(*AR_CChain); @@ -4263,6 +5001,28 @@ namespace ZNsMain return AR_COStream; } /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + template + std::ostream& operator << + ( + std::ostream& AR_COStream, const ZtCObjtInitChain + & AR_CChain + ) + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ + { + AR_COStream< TypeObjtChain; + + if(TypeObjtChain::ZEBoolNext>0) + { + cout<<", "; return AR_COStream<0)*/ + + return AR_COStream; + } + /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ diff --git a/ZCppMainTest/c++_test_006.cpp b/ZCppMainTest/c++_test_006.cpp index 57e8924..3c6d6d1 100644 --- a/ZCppMainTest/c++_test_006.cpp +++ b/ZCppMainTest/c++_test_006.cpp @@ -257,6 +257,29 @@ namespace ZNsMain cout<<"************************************"< > > + > ZCObjtInitChain; ZCObjtInitChain VO_ZCObjtInitChain; + + cout<<"# VO_ZCObjtInitChain : use cout"<()='A'; + *VO_ZCObjtInitChain.GetChainByNo<1>()=string("ABC"); + *VO_ZCObjtInitChain.GetChainByNo<2>()=1.2; + *VO_ZCObjtInitChain.GetChainByNo<3>()=999; + + cout<<"# VO_ZCObjtInitChain : use IterElement & ZCPrint()"< ZCDataRing; ZCDataRing VO_CDataRing = string("123"); @@ -280,10 +303,10 @@ namespace ZNsMain VO_CDataRing.IterThisRev(&ZftPrint); cout<