问题标签 [policy-based-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
95 浏览

c++ - 将编译时 C 回调转换为编译时 C++ 回调

我正在为嵌入式设备(ESP32)将 C 代码库转换为 C++。在当前代码中重复的一件事是向 C 模块声明“回调”并在“用户”模块中实现它们的方法。

例如,Button 模块的当前 API 如下:

知道函数是extern默认编辑的,这只是一个标志,表明模块不是负责实现它们的人。此方法的主要优点是链接器在编译时捕获未实现的回调。

在过渡到 C++ 时,我想保持编译时检查回调实现的存在(我不需要动态调度),但也允许创建多个对象,所以我需要类。

虽然我是 CRTP 和基于策略的设计的新手,但我想我应该选择其中之一。或者可能是模板函子?这两者有什么区别?

我目前的想法如下:

实现代码在哪里:

让我感到困扰的一件主要事情是我仍然希望将实现保留在cpp文件中而不是标题中。对于这个Button类,我想在一个cpp文件中实现构造函数。我怎样才能做到这一点?

总的来说,这有意义吗?有没有更好的方法来注入回调而不使用继承?

0 投票
1 回答
61 浏览

c++ - 创建基于策略的类时,如何将模板参数转发到 std::make_unique ?

假设我正在使用基于策略的模板设计模式(请参阅https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design)。

我遇到了一些与如何使用std::make_shared(或就此而言 std::make_unique)创建新类型Bar相关的问题,该类型具有一些可选的模板参数。
如果我不想更改默认策略,那没问题,简单的行就可以了:

但是,如果我希望 Bar 接受不同的“策略”作为模板参数,我该如何将它们传递给 std::make_unique ?

尝试了以下(没有运气):

或者:

以下是一些示例代码来演示该问题:




问题在 Foo CTOR 的初始化程序内部:如何将 T & V 模板参数转发到 std::make_unique ?

感谢任何帮助:)

0 投票
0 回答
23 浏览

c++ - 策略类设计:如何添加选择所需类的 CMake 选项

我编写了以下定义一些策略类的特征:

我使用这些特征来配置模拟类的行为:MyClass<memory::on_RAM>MyClass<memory::on_disk>

Eveything 工作正常,但我希望结果程序的用户能够选择或其他替代方案,而无需修改源代码。

我想我可以通过为 CMake 提供一个选项来要求他们覆盖默认实现,这可以将其提供给编译器,这可以做出一些编译时选择。但我不知道如何在技术上实现它。有什么建议吗?