【问题标题】:C++ Instantiation of a struct which have a non-type template具有非类型模板的结构的 C++ 实例化
【发布时间】:2020-09-15 20:31:01
【问题描述】:

通常,我们可以通过以下方式创建结构的一个或多个实例:

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;

我想不出为什么不允许这样做。对于为什么不允许这样做,或者仅仅是因为标准中没有定义这种语法,是否有具体的答案?

编辑:

由于可以将其视为基于意见的问题,因此我想知道是否有类似的语法可以使用。

【问题讨论】:

  • 结构类型是否非常需要匿名?
  • 一个没有名字的类模板,你立即实例化并不觉得它应该是一个类模板。为什么不给它起个名字就可以了,比如this
  • @jtbandes 不需要匿名结构。我可以称它为 Register,但不会在代码中的其他任何地方使用 Register 类型。它仅用于创建这些实例。我问这个问题是因为我很好奇:)

标签: c++ templates struct syntax non-type


【解决方案1】:

与一般结构的情况不同,规则规定,

“不应该存在没有名字的模板类”

如果你仔细想想,它是有道理的。在匿名结构的定义结束后,除了对象名称之外应该没有任何其他内容。所以模板参数没有空间了。

即使可以将模板参数放在匿名模板之后,然后声明 2 个对象

&lt;1&gt;Register1, &lt;2&gt;Register2;

一起,一个接一个,会是另一个问题!

使用命名空间可能是您认为有用的替代解决方案。

如果您真的需要匿名,另一种解决方案可能如下所示:

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;

.
.
.


【讨论】:

    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多