- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个 C++ 硬件抽象层 (HAL),它需要尽可能快。
多态性提供了最好的 API,但虚拟表查找确实会降低代码的速度。
这引导我结合使用模板和策略来获得编译时多态性。但是因为具有不同参数的模板被实例化为完全不同的类型,所以我不能在函数调用中互换使用它们,除非函数也是模板。
但是,我不想强迫我的 HAL 库的用户将所有函数编写为模板,因为我已经使用了模板。
为了便于说明,假设这是我的 HAL:
template<typename T_POLICY>
class I2CManager {
public:
void send(uint8_t data) {
T_POLICY::send(data);
++sent_data;
}
private:
int sent_data; // Just to illustrate that I2CManager has state
};
class I2C1 {
static void send(uint8_t data) { /* Run some code here */ }
};
class I2C2 {
static void send(uint8_t data) { /* Run other code here */ }
};
// OTHER HW
template<typename T_POLICY>
class UARTManager { ··· };
class UART1 { ··· };
class UART2 { ··· };
template<typename T_POLICY>
class TIMERManager { ··· };
class TIMER1A { ··· };
class TIMER1B { ··· };
这行得通,我现在可以创建一个具有不同策略的 I2CManager,如下所示。我什至可以让多个 I2CManager 同时以不同的策略运行。
I2CManager<I2C1> i2c1;
I2CManager<I2C2> i2c2;
i2c1.send(0x11); // This works
i2c2.send(0x11); // This also works
现在,i2c1 和 i2c2 具有相同的公共(public)方法,但它们不可互换。因此,我的 HAL 库的用户也被迫使用模板。
// THIS DOES NOT WORK
void foo(I2CManager m) { m.send(0x11); }
foo(my_manager_1);
// BUT THIS WORKS
template<typename T>
void foo(I2CManager<T> m) { m.send(0x11); }
foo(i2c1);
我能否以某种方式获得编译时多态性但允许最终用户将其视为正常多态性?为了速度,我不在乎我的库中的内部代码是否变得丑陋或难以阅读,但 API 必须尽可能简单和直观。
实际上,我希望 foo() 专门针对不同的参数(并在代码中复制),就好像它是一个模板一样,但我不想让我的库的用户注意到它是一个模板函数。也欢迎替代模板。
我不知道这是否可能,但我已经阅读了一些关于概念的内容,它们将出现在下一个 C++ 标准中。我想要编译时多态性,但与运行时多态性一样用户友好。
注意事项:
因为我正在连接 HW,所以我的 HWManagers 的每个实例化不同的策略将是唯一的(即只有一个HWManager 实例和一个 HWManager 实例,可能同时存在也可能不同时存在)。
所有实例都由库创建为全局变量,并且不可堆放。
所有的策略方法都非常短,所以有多个唯一的由于模板的实例比虚拟表更可取为了执行速度。
代码大小并不重要(对于嵌入式系统而言),但 RAM 使用量和执行速度。我需要尽可能多的解决在编译期间。再一次,我愿意有一个过度臃肿可执行以避免运行时解析。
仅支持 C++03
已编辑代码示例
最佳答案
All instances are created by the library as global variables, and are not heapable.
你的意思是这样的,对吧?
static HWManager<DrierPolicy> drierManager;
static HWManager<FridgePolicy> fridgeManager;
那么,让用户知道它们并允许她/他直接使用它们有什么错:
drierManager.doStuff();
fridgeManager.doStuff();
然后……
Because I'm interfacing HW, each instantiation of my HWManagers with different policies will be unique
那为什么要将 doStuff 方法实现为实例方法呢?一些静态方法还不够好吗?
(这些是问题,而不是批评。是的,我知道,这不是一个答案 - 虽然它可能是一个 - 但我需要评论没有提供的额外格式)
关于C++从编译时多态性中隐藏模板习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39570617/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!