#include<streambuf>#include<ostream>namespacestd{classstreambuf;classostream{explicitostream(std::streambuf*buf);//...};}// A customization of streambuf.classfdoutbuf:publicstd::streambuf{public:explicitfdoutbuf(intfd);//...};classfdostream:publicstd::ostream{protected:fdoutbufbuf;public:explicitfdostream(intfd):buf(fd),std::ostream(&buf)// This is not allowed: buf can't be initialized before std::ostream.// std::ostream needs a std::streambuf object defined inside fdoutbuf.{}};
#include<streambuf>#include<ostream>classfdoutbuf:publicstd::streambuf{public:explicitfdoutbuf(intfd);//...};structfdostream_pbase// A newly introduced class.{fdoutbufsbuffer;// The member moved 'up' the hierarchy.explicitfdostream_pbase(intfd):sbuffer(fd){}};classfdostream:protectedfdostream_pbase// This class will be initialized before the next one.,publicstd::ostream{public:explicitfdostream(intfd):fdostream_pbase(fd),// Initialize the newly added base before std::ostream.std::ostream(&sbuffer)// Now safe to pass the pointer.{}//...};intmain(){fdostreamstandard_out(1);standard_out<<"Hello, World\n";return0;}
classTensorDataAccessStrided// declaration order is important here:privatedetail::BaseFromMember<TensorShapeInfo>,publicdetail::TensorDataAccessStridedImpl{public:staticboolIsCompatible(constITensorData&data){returndynamic_cast<constITensorDataStrided*>(&data)!=nullptr;}staticdetail::Optional<TensorDataAccessStrided>Create(constITensorData&data){if(auto*dataStrided=dynamic_cast<constITensorDataStrided*>(&data)){returnTensorDataAccessStrided(*dataStrided);}else{returndetail::NullOpt;}}TensorDataAccessStrided(constTensorDataAccessStrided&that):MemberShapeInfo(that),detail::TensorDataAccessStridedImpl(that,MemberShapeInfo::member){}private:usingMemberShapeInfo=detail::BaseFromMember<TensorShapeInfo>;TensorDataAccessStrided(constITensorDataStrided&data):MemberShapeInfo{*TensorShapeInfo::Create(data.shape())},detail::TensorDataAccessStridedImpl(data,MemberShapeInfo::member){}};