次のように、動作するコード。
#include <iostream>
template<class Detail>
class AbstractLogger
{
public:
static void log(const char* str) {
Detail::log_detailled(str);
}
};
class Logger : public AbstractLogger<Logger>
{
public:
static void log_detailled(const char* str) {
std::cerr << str << std::endl;
}
};
int main(void)
{
AbstractLogger<Logger>::log("main function running!");
return 0;
}
ここで、ライブラリに入れて、ライブラリユーザーに、ここのクラスAbstractLogger
のように自分のロガーを定義させたいと思います。Logger
これには1つの欠点があります。AbstractLogger<Logger>
ライブラリが認識できないため、ライブラリ内で使用できないことLogger
です。
ノート:
- 仮想関数や質問はしないでください。また、「静的仮想」メンバーが無効であるという同様の問題を認識しています。たぶん、CRTPには回避策があります:)
- C ++ 11は興味深いものですが、「通常の」C++が必要です。