這里你可以看到一個很好的例子。如果使用虛擬方法,程序?qū)⒅肋\(yùn)行時執(zhí)行的是什么。實(shí)現(xiàn)CRTP編譯器是在編譯時決定的!這是一場精彩的表演!
template <class T>class Writer{
public:
Writer() { }
~Writer() { }
void write(const char* str) const
{
static_cast<const T*>(this)->writeImpl(str); //here the magic is!!!
}};class FileWriter : public Writer<FileWriter>{
public:
FileWriter(FILE* aFile) { mFile = aFile; }
~FileWriter() { fclose(mFile); }
//here comes the implementation of the write method on the subclass
void writeImpl(const char* str) const
{
fprintf(mFile, "%s\n", str);
}
private:
FILE* mFile;};class ConsoleWriter : public Writer<ConsoleWriter>{
public:
ConsoleWriter() { }
~ConsoleWriter() { }
void writeImpl(const char* str) const
{
printf("%s\n", str);
}};