使用static_assert确保最多只能使用 *模板参数

Use static_assert to ensure template parameter is only used *at most* once

本文关键字:参数 static assert 确保 使用      更新时间:2023-10-16

是否可以确保(或最多都可以使用模板参数的组合(来确保某个模板参数(或模板参数的组合(一次?是否可以跟踪使用次数的次数,如果使用多次,则可以丢下static_assert错误?

作为一个例子 - 假设我想创建一个基于静态模板的GPIO类:

template<uint8_t Port, uint8_t Pin> class Gpio {};

一个人可以在单板类中铺设整个板:

struct Board {
  Gpio<1, 1> myInputPin;
  Gpio<1, 2> myOutputPin;
  Gpio<2, 0> ledR;
  Gpio<2, 1> ledG;
  Gpio<2, 2> ledB;
};

对于任何给定的端口/引脚组合,对于该端口和销钉进行实例化的A GPIO模板才有意义。如果某人为同一端口/PIN组合创建了两个不同的GPIO实例,则可能代表冲突,我想在编译过程中捕获此错误。

这是可能的吗?

您可以用宏解决此问题:

#define GPIO(Port, Pin) 
    friend void _gpio_ ## Port ## _ ## Pin(){} 
    Gpio<Port, Pin>

然后,如果您两次使用GPIO(2, 2),则编译器会说这样的话:

error: redefinition of '_gpio_2_2'
  GPIO(2, 2) ledX;
  ^
<source>:14:3: note: previous definition is here
  GPIO(2, 2) ledB;
  ^

演示:https://godbolt.org/z/ronv0u