通常,我们可以通过以下方式创建一个或多个struct实例:
struct
{
const uint8_t Address;
struct
{
uint8_t GPIO1 : N;
uint8_t GPIO2 : N;
uint8_t GPIO3 : N;
uint8_t GPIO4 : N;
uint8_t GPIO5 : N;
uint8_t GPIO6 : N;
uint8_t GPIO7 : N;
uint8_t GPIO8 : N;
} Value;
} Register1, Register2;
不幸的是,当结构具有模板时,情况似乎并非如此(VSCode给出语法错误):template<uint8_t N = 1> struct
{
const uint8_t Address;
struct
{
uint8_t GPIO1 : N;
uint8_t GPIO2 : N;
uint8_t GPIO3 : N;
uint8_t GPIO4 : N;
uint8_t GPIO5 : N;
uint8_t GPIO6 : N;
uint8_t GPIO7 : N;
uint8_t GPIO8 : N;
} Value;
} <1>Register1, <2>Register2;
我想不出为什么不允许这样做的原因。关于为什么不允许这样做还是仅仅是因为该语法未在标准中定义而有一个具体的答案吗?编辑:
由于可以将其视为基于意见的问题,因此我想知道是否存在类似的语法。
最佳答案
与一般结构不同,规则说,
“没有名称的模板类应该不存在”
如果您考虑一下,这是有道理的。在匿名结构的定义结束之后,除了对象名称之外,应该什么都没有。因此没有模板参数的空间。
同样,即使可以将模板参数放在匿名模板之后,也可以声明2个对象<1>Register1, <2>Register2;
在一起,一个接一个,将是另一个问题!
使用 namespace 可能是您发现有用的替代解决方案。
如果您确实需要匿名,则另一个解决方案可能如下所示:
struct{
template<uint8_t N = 1>
struct Reg
{
const uint8_t Address{};
struct
{
uint8_t GPIO1 : N;
uint8_t GPIO2 : N;
uint8_t GPIO3 : N;
uint8_t GPIO4 : N;
uint8_t GPIO5 : N;
uint8_t GPIO6 : N;
uint8_t GPIO7 : N;
uint8_t GPIO8 : N;
} Value;
};
Reg<1> Register1;
Reg<2> Register2;
}Regs;
uint8_t v1 = Regs.Register1.Address;
uint8_t v2 = Regs.Register2.Address;
这与您的想法不一样。另外,如果您只打算使用模板结构几次,那么可能值得为这几次编写等效的匿名结构:
struct
{
const uint8_t Address{};
struct
{
uint8_t GPIO1 : 1;
uint8_t GPIO2 : 1;
uint8_t GPIO3 : 1;
uint8_t GPIO4 : 1;
uint8_t GPIO5 : 1;
uint8_t GPIO6 : 1;
uint8_t GPIO7 : 1;
uint8_t GPIO8 : 1;
} Value;
}Register1;
struct
{
const uint8_t Address{};
struct
{
uint8_t GPIO1 : 2;
uint8_t GPIO2 : 2;
uint8_t GPIO3 : 2;
uint8_t GPIO4 : 2;
uint8_t GPIO5 : 2;
uint8_t GPIO6 : 2;
uint8_t GPIO7 : 2;
uint8_t GPIO8 : 2;
} Value;
}Register2;
.
.
.
关于c++ - 具有非类型模板的结构的C++实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63909437/