给定以下工作代码。

#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

笔记:
  • 请不要使用虚函数或为什么不这样做。另外,我知道类似的问题,即“静态虚拟”成员无效。也许在CRTP中有一种解决方法:)
  • C++ 11会很有趣,但是,我需要“常规” C++。
  • 最佳答案

    通常的方法是针对一个概念进行编码,同时提供帮助程序,以便用户可以轻松地生成满足一个或多个这些概念的类型。例如,像boost::iterator_facade这样的东西就是CRTP的帮助者,它使用户更容易编写迭代器。然后,该迭代器可在接受迭代器的任何地方使用-例如在std::vector的范围构造函数中。请注意,特定的构造函数如何不具有用户定义类型的知识。

    在您的情况下,AbstractLogger将是CRTP的帮助者。缺少的部分将是定义例如记录器的概念。结果,请注意,需要记录器的所有内容都需要实现为模板,或者需要一个类型擦除容器来容纳任意记录器。

    概念检查(如Boost提供的检查)对于这种编程很方便,因为它们允许用实际代码表示一个概念。

    关于c++ - 不知道派生类型的静态CRTP类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12866070/

    10-17 01:39