Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不存在动态多态的模板参数解耦

不存在动态多态的模板参数解耦
EN

Stack Overflow用户
提问于 2017-04-06 07:25:33
回答 1查看 82关注 0票数 2

我编写了一个Ringbuffer类,其中包括用来缓冲数据进行串行传输的类。缓冲区的大小由模板参数BUFFER_SIZE定义。这在避免动态内存分配的同时,保持了缓冲区的通用性。例如,接收和发送缓冲区的大小可以不同,并且在编译时就知道内存的使用情况。目标是一个小型微控制器(AVR)。

Ringbuffer类的简化表示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<int BUFFER_SIZE>
class Ringbuffer
{
    protected:
    uint8_t _buffer[BUFFER_SIZE];
    public:
    void push(uint8_t);
    uint8_t getNext();
}

使用Ringbuffer的类(例如用于框架或控制UART的类)不需要知道Ringbuffer的模板参数BUFFER_SIZE。

使用动态多态性可以很容易地实现这一点。但是,我希望避免动态多态(虚拟函数查找、缺少编译器检查)的成本。

是否有不同的方法将对模板类的访问与其模板参数分离?

与动态多态相反,使用静态多态性(使用奇怪的重复模板模式)无法解决这个问题。

微控制器的有限资源是我希望避免动态内存分配和动态多态的主要原因。

AVR的C++在某种程度上是有限的,但是答案可以忽略这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-06 08:10:27

这个解决方案对你有用吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Pass pointer to `Ringbuffer` to use in other classes
class Ringbuffer 
{
    uint8_t* _bufPtr; // Downside is you need to store additional 2 fields
    int _bufSize;
protected:
    constexpr Ringbuffer(uint8_t* bufPtr, int bufSize) : _bufPtr(bufPtr), _bufSize(bufSize) { }

    template <std::size_t N>
    constexpr Ringbuffer(uint8_t (&buffer)[N]) : _bufPtr(buffer), _bufSize(N) {}

    constexpr Ringbuffer(const Ringbuffer&) = default;
    Ringbuffer& operator=(const Ringbuffer&) = default;
public:
    void push(uint8_t); // Work with _bufPtr / _bufSize instead of _buffer
    uint8_t getNext();
};

// Passed pointers to `Ringbuffer` will actually point to `RingbufferFinal`
// with static buffer with parametrized size
template<int BUFFER_SIZE>
class RingbufferFinal : public Ringbuffer 
{
protected:
    uint8_t _buffer[BUFFER_SIZE];

public:
    constexpr RingbufferFinal() : Ringbuffer(_buffer) {}

    constexpr RingbufferFinal(const RingbufferFinal<BUFFER_SIZE>& other) :
        Ringbuffer(*this)
    {
        // Copy contents of other._buffer only.
        // _bufPtr of both buffers remains unchanged.
        memcpy(_buffer, other._buffer, BUFFER_SIZE);
    }

    constexpr RingbufferFinal& operator=(const RingbufferFinal<BUFFER_SIZE>& other)
    {
        memcpy(_buffer, other._buffer, BUFFER_SIZE);
        return *this;
    }
};

编辑:正如Jarod42所指出的,以前的解决方案在复制时失败了,因此我添加了复制函数以确保正确性。在这种情况下,我想在缓冲区之间复制内容是正确的行为,不应该允许复制基类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43259414

复制
相关文章
MultiVelo推断动态解耦的基因调控
单细胞多组学数据旨在相同细胞中捕获细胞多分子模式,提供了探索细胞表观基因组和转录组关系的机会。作者开发了MultiVelo,这是一种基因表达的机制模型。它纳入表观基因组数据的同时扩展了RNA速率框架。MultiVelo使用概率隐变量模型从单细胞数据估计染色质可及性和基因表达的转换时间和速率参数,提供表观基因组和转录组变化之间时间关系的定量总结。与仅从RNA估算的方法相比,结合染色质可及性数据显著提高了细胞命运预测的准确性。在来自大脑、皮肤和血细胞的单细胞多组学数据集上拟合MultiVelo揭示了两类不同的基因。该模型还确定了四种细胞状态——表观基因组和转录组耦合的两种状态和两种不同的解耦状态。MultiVelo推断的参数量化了基因占据四种状态的时间长度,根据转录组和表观基因组之间的耦合程度对基因进行排序。最后,作者确定了转录因子表达和结合位点可及性之间以及疾病相关SNP可及性和连锁基因表达之间的时滞。
DrugAI
2022/01/13
7540
MultiVelo推断动态解耦的基因调控
Flutter 解耦
uncoupling使用了标记的方式,直接操作文件代码以实现代码物理方式的灵活插入与抽取,对工程没有任何侵入性,简单易用。
花落花相惜
2021/12/15
6030
装饰者解耦的秘诀
[译] 如何创建高度模块化的 Android 应用里面讲解了装饰者做组合的问题。更多的是使用方法,我们需要站在他的肩膀上去思考这个问题,并做知识的内化。
jerrypxiao
2020/04/08
9470
框架解耦神器 -- REventBus
在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:
Rice加饭
2023/06/01
2900
框架解耦神器 -- REventBus
框架解耦神器 -- REventBus
在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:
Rice加饭
2023/09/02
2130
框架解耦神器 -- REventBus
自定义注解实现参数验证与业务代码解耦
核心依赖 <!-- aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId>
Meet相识
2018/09/12
1.3K0
Java多态(动态多态)
向上转型是安全的 向下转型却不一定是安全的。 向下转型成为强制类型转换 其意思是从父类转为子类 转了后你可以拥有更多的方法 因为子类通常有比父类更多的方法。 向上转型称为抽象,抽象的内容将在下一个内容讲。
你的明明呐丶
2022/06/27
6560
Java多态(动态多态)
使用IOC解耦React组件
除了DI外,另一种实现方式是Dependency Lookup(依赖查找),简称DL。
公众号@魔术师卡颂
2021/03/15
9170
巧用NULL模式解耦依赖
由于需求的变化,应用B需要库libM.a的能力,以便和服务M交互。为了复用和简化,通过类A间接提供,应用B不用修改代码,只需要重新编译即可获得新的能力,其它用到类A的应用也是如此。
一见
2018/09/30
5300
巧用NULL模式解耦依赖
解耦重构 Internet BGP SDN
高清视频直播和云计算的蓬勃发展,带来互联网流量持续高速增长,主流云公司的Internet出口带宽都已经达到Tbps级别。 鉴于网络的拥堵大部分发生在出口互联,Edge Peering Fabric的架构设计直接影响到终端客户的用户体验, 2017年Google/Facebook对外发布了两种不同的Edge 设计理念,本文试着以Google Espresso为主详解下一代Cloud Edge的架构,并简单介绍一下Facebook Edge Fabric。
SDNLAB
2018/10/24
2.1K0
解耦重构 Internet BGP SDN
产品经理 | 什么是解耦?
在理解解耦之前,我们先来理解耦合度。耦合度是软件工程领域的概念,是指模块之间的依赖程度。
产品的技术小课
2022/09/02
3.4K0
奇思妙想 | 重参数化,解耦网络结构的训练和推理
来源丨https://zhuanlan.zhihu.com/p/361090497
公众号机器学习与AI生成创作
2021/04/19
1.9K0
奇思妙想 | 重参数化,解耦网络结构的训练和推理
编程思想 定义过滤的方式解耦
本文将会很少涉及 dotnet 的知识,主要讲用定义过滤的方式解除过程业务的耦合。在一些业务上,可以从业务层面或逻辑层面明显分为几层,每一层之前的数据相互依赖或处理顺序相互依赖,但逻辑都独立。此时如果将业务处理放在过程处理里面,将会让过程处理耦合具体业务。而定义过滤的方式为让过程逻辑只是搭建框架为主,具体业务通过注入过滤的形式加入到处理
林德熙
2020/03/12
5320
复杂任务中,流程的解耦设计
在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整个流程的完整执行;
知了一笑
2022/06/14
1.2K0
复杂任务中,流程的解耦设计
模块解耦的三种方案
URLRouter:将不同的模块定义成为不同的URL,通过URL的形式进行跨模块调用。
Helloted
2022/06/08
1.4K0
模块解耦的三种方案
业务解耦-事件监听模式的使用
事件监听机制有点类似于sub/pub模式,不过这个技术点也仅适用于单体应用的范围,分布式应用还是老老实实使用消息队列来进行吧。
码农王同学
2020/03/25
4420
模块化与解耦(转)
本文主要讲述了在iOS开发过程中,模块化工程架构的一种组织方式,本文主要讲述基于cocoapods来做模块化的方案,详细讲述了iOS开发怎么进行模块划分的内容,主要会在以下方面做阐述:
VV木公子
2018/06/05
7.5K0
Vue3模板语法--动态参数
这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。例如,如果你的组件实例有一个 data property attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href。
软件架构师Michael
2022/08/30
1.1K0
使用Spring Event解耦业务开发
Spring 事件是观察者模式的一种体现,对象间的一对多关系,被观察者发出信号时候会通知监听该事件的观察者;而发布-订阅模型往往需要一个调度中心,如消息队列等
itliusir
2018/10/08
1.1K0
使用Spring Event解耦业务开发
点击加载更多

相似问题

C++:如何获得解耦的多态行为

33

PHP模板模式UI和内容解耦

10

解耦OOP

69

DbContext解耦

20

解耦模式

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文