首页 > 技术文章 > 失败则重复动作的模板方法

asa-ben-clc 2021-03-17 15:52 原文

在实际项目中,经常碰到这种情况:对某些配置仅设置(或发送)一次的话,可能会失败,所以想在失败时多尝试几次。

如果一个项目里涉及好几个不同的设备,他们用多种不同的设置(或发送)方法时,往往就会写很多相似的函数,这个时候模板就派上用场了。

话说正题,怎么写一个失败则重复发送n次的模板方法呢?如下(Linux环境中):

说明:上面就是一个失败时最多重复发3次的模板方法;

即可能的设备T有一个发送方法send_your_func(...),当其返回>0时则表示发送成功,此时不用再尝试了;否则会最多重复3次到成功为止,或最终仍是失败;当成功时它也返回>0的值。

注意T的发送方法send_your_func只是一个标识(占位),调用时填实际的发送函数,虽然send_your_func只是一个标识,但是判断发送成功的判定规则是其返回值>0,这个却是硬性要求。

像一般的send()或write()方法都是满足这个要求的,而且当其他人就用上面的模板方法做发送函数(装饰)时,也能遵循这个判定规则/要求;

那么怎么调用呢?比如有一个串口设备类Uart,其发送字节的函数声明为: int write_once(const unsigned char* , int); 要求其一个该类对象比如Uart intance,该对象在失败时尝试5次发送一段字节数据(每次间隔300毫秒),那么如下调用:

unsigned char data[] = "你要发送的数据";

int ret = T_sendUch<Uart, 300>(&intance, &Uart::write_once(data, sizeof(data)), 5);

if (ret > 0)  { /*发送成功*/ }

 

推荐阅读