c++ - 通过CRTP简化相互扩展类的API

标签 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;
}

最佳答案

一个问题是 Extension2 的模板参数与 Base1 的签名不匹配。另一个是Extension2Base1期望的参数类型不匹配。

如果您更改 Extension2 的定义以适本地接受 Base1,它本身仍然不是要传递给 Base1 的候选者。您可以使用符合 Base1 预期的内部模板类来解决这个问题。这个内部类看起来很像 Extension1

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

关于c++ - 通过CRTP简化相互扩展类的API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50197512/

相关文章:

c++ - 在 C++ 中调用析构函数不会手动销毁对象

c++ - 为什么返回值优化发生在这里

php - 使用 php 的模板?

c++ - 模板函数的实例化

json - 在 Swagger-UI 中覆盖动词级模型/模型架构

创建自己的 API 时的 Java API 设计问题

swagger - Swagger ,是否有推荐的方法来记录具有长度限制的数字字段?

c++ - 这个 has_member 类模板是如何工作的?

c++ - 归并排序困惑的类型

c++ - if/else 在 C++ 的编译时?