通过CRTP简化彼此扩展的类的API

时间:2018-05-06 08:02:27

标签: c++ templates api-design crtp template-templates

我想编写通过(CRTP)扩展多个类的类。

我只能让Extension<Base<Extension>> my_object;工作。

我想要的api是:Extension<Base> my_object;

如何使这个api工作?

感谢。

测试(代码也在godbolt.org):

#include <iostream>

template <template<typename...> class Extension>
class Base1 : public Extension<Base1<Extension>> {
public:
    static void beep() { std::cout << "Base1 "; }
};

template <class Plugin>
class Extension1 {
public:
    Extension1() : plugin_(static_cast<Plugin*>(this)) {}
    void beep() {
        plugin_->beep();
        std::cout << "Extension1\n";
    }
private:
    Plugin* plugin_;
};

template <template<typename...> class Plugin>
class Extension2 {
public:
    Extension2() : plugin_(static_cast<Plugin<Extension2>*>(this)) {}
    void beep() {
        plugin_->beep();
        std::cout << "Extension2\n";
    }
private:
    Plugin<Extension2>* plugin_;
};

int main() {
    // This works.
    Extension1<Base1<Extension1>>b;
    b.beep();
    // This doesn't work.
    Extension2<Base1> c;
    c.beep();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

一个问题是importScripts("precache-manifest.aa4b439ba2589f9d3cf0c56e1b06323d.js", "https://storage.googleapis.com/workbox-cdn/releases/3.1.0/workbox-sw.js"); workbox.skipWaiting(); workbox.clientsClaim(); workbox.precaching.precacheAndRoute([]) workbox.routing.registerRoute( 的模板参数与Extension2的签名不匹配。另一个原因是Base1Extension2预期的参数类型不匹配。

如果您将Base1的定义更改为属性接受Extension2,则它本身仍然不是传递给Base1的候选者。您可以使用与Base1期望的匹配的内部模板类来解决这个问题。这个内部类看起来很像Base1

Extension1