给定以下工作代码。
#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
类。这有一个缺点:由于库无法识别AbstractLogger<Logger>
,因此无法在库内部使用Logger
。笔记:
最佳答案
通常的方法是针对一个概念进行编码,同时提供帮助程序,以便用户可以轻松地生成满足一个或多个这些概念的类型。例如,像boost::iterator_facade
这样的东西就是CRTP的帮助者,它使用户更容易编写迭代器。然后,该迭代器可在接受迭代器的任何地方使用-例如在std::vector
的范围构造函数中。请注意,特定的构造函数如何不具有用户定义类型的知识。
在您的情况下,AbstractLogger
将是CRTP的帮助者。缺少的部分将是定义例如记录器的概念。结果,请注意,需要记录器的所有内容都需要实现为模板,或者需要一个类型擦除容器来容纳任意记录器。
概念检查(如Boost提供的检查)对于这种编程很方便,因为它们允许用实际代码表示一个概念。
关于c++ - 不知道派生类型的静态CRTP类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12866070/