Sullivan's BLOG

琐碎,定格,在南方

现代C++:形参包的解包

前言

很多人从传统角度认为,在嵌入式中使用C++模板会导致代码膨胀(特别是STL),在flash紧张的嵌入式系统中是没法使用的,但实际上并非如此,比如像封装底层驱动驱动,零成本的抽象,基于C++的模板对RTOS的进行封装,可变参数模板,还可以进行编译期检查,十分的方便

形参包

模板形参包是接受零个或更多个模板实参(非类型、类型或模板)的模板形参。函数形参包是接受零个或更多个函数实参的函数形参。至少有一个形参包的模板被称作变参模板,对于形参包的解包方法随着C++的发展也有了非常多的变化,下面介绍一下我最近使用的一些套路。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <gpio_num_t num> struct z_gpio
{
int real_addr = 1ULL << num;
static inline void set()
{
gpio_set_level(num, 1);
}

static inline void clr()
{
gpio_set_level(num, 0);
}
};
template <gpio_num_t num> using z_pin = z_gpio<num>;
using GP1 = z_pin<GPIO_NUM_1>;

// use
GP1::set();

上面的代码对gpio的操作进行了一个简单的封装,但是在实际工程中初始化时,需要对多个GPIO进行初始化,所以我们需要以可变模板的形式对其进行封装。

1