#include <iostream>#include<cstdint>#include<atomic>using namespacestd;template<typename erange>classcglobalseqt{ Public: typedef uint32_t seq_t; Staticseq_t Gen (BOOLNext =true) { StaticCglobalseqt<erange>instance; if(next) {returninstance. Next (); } Else{instance. Reset (); return 0; } }Private: CGLOBALSEQT (): M_min ((seq_t) erange::min), M_max ((seq_t) Erange::max), M_seq ((seq_t) Erange: : MIN-1) {static_assert (seq_t) erange::min< (seq_t) Erange::max,"Invalid range"); } inline uint32_t Next () {seq_t Expected_max=M_max; if(M_seq.compare_exchange_strong (Expected_max, m_min)) {returnm_min; } Else { return++M_seq; }} inlinevoidReset () {m_seq= M_min-1; } seq_t m_min; seq_t M_max; Std::atomic<SEQ_T>m_seq;};classCINBOUNDGLOBALSEQ: PublicCglobalseqt<cinboundglobalseq>{ Public: enumerange {MIN =0, MAX =Uint32_max};};classCOUTBOUNDGLOBALSEQ: PublicCglobalseqt<coutboundglobalseq>{ Public: enumerange {MIN = -, MAX =2002 };};intMain () {cout<<"Inbound:"<< Cinboundglobalseq::gen () <<","<< Cinboundglobalseq::gen () <<Endl; cout<<"1.outbound:"<< Coutboundglobalseq::gen () <<","<< Coutboundglobalseq::gen () <<","<< Coutboundglobalseq::gen () <<","<< Coutboundglobalseq::gen () <<Endl; Coutboundglobalseq::gen (false); cout<<"2.outbound:"<< Coutboundglobalseq::gen () <<","<< Coutboundglobalseq::gen () <<Endl; return 0;}
C + + Misc Code inheritance and templates