什么是奇怪的重复模板模式(CRTP)?

什么是奇怪的重复模板模式(CRTP)?

没有参考一本书,谁能给出一个很好的解释CRTP用一个代码示例?



慕的地6264312
浏览 572回答 3
3回答

米脂

这里你可以看到一个很好的例子。如果使用虚拟方法,程序将知道运行时执行的是什么。实现CRTP编译器是在编译时决定的!这是一场精彩的表演!template&nbsp;<class&nbsp;T>class&nbsp;Writer{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;Writer()&nbsp;&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;~Writer()&nbsp;&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;write(const&nbsp;char*&nbsp;str)&nbsp;const &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static_cast<const&nbsp;T*>(this)->writeImpl(str);&nbsp;//here&nbsp;the&nbsp;magic&nbsp;is!!! &nbsp;&nbsp;&nbsp;&nbsp;}};class&nbsp;FileWriter&nbsp;:&nbsp;public&nbsp;Writer<FileWriter>{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;FileWriter(FILE*&nbsp;aFile)&nbsp;{&nbsp;mFile&nbsp;=&nbsp;aFile;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;~FileWriter()&nbsp;{&nbsp;fclose(mFile);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//here&nbsp;comes&nbsp;the&nbsp;implementation&nbsp;of&nbsp;the&nbsp;write&nbsp;method&nbsp;on&nbsp;the&nbsp;subclass &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;writeImpl(const&nbsp;char*&nbsp;str)&nbsp;const &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(mFile,&nbsp;"%s\n",&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;private: &nbsp;&nbsp;&nbsp;&nbsp;FILE*&nbsp;mFile;};class&nbsp;ConsoleWriter&nbsp;:&nbsp;public&nbsp;Writer<ConsoleWriter>{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;ConsoleWriter()&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;~ConsoleWriter()&nbsp;{&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;writeImpl(const&nbsp;char*&nbsp;str)&nbsp;const &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;str); &nbsp;&nbsp;&nbsp;&nbsp;}};
打开App,查看更多内容
随时随地看视频慕课网APP