我想编写通过(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;
}
答案 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
的签名不匹配。另一个原因是Base1
与Extension2
预期的参数类型不匹配。
如果您将Base1
的定义更改为属性接受Extension2
,则它本身仍然不是传递给Base1
的候选者。您可以使用与Base1
期望的匹配的内部模板类来解决这个问题。这个内部类看起来很像Base1
。
Extension1