Warm tip: This article is reproduced from serverfault.com, please click

c++-如何在不动态分配的情况下创建模板对象数组

(c++ - How to create array of templated objects without dynamic allocation)

发布于 2020-12-02 16:34:43

我一直在使用C ++编程语言开发SPI I / O扩展器的软件驱动程序。我决定以这种方式在I / O扩展器中对寄存器建模

class Register
{
  public:

    virtual bool read(void) = 0;
    virtual bool write(uint8_t data) = 0;
    virtual uint8_t getData(void) = 0;
    virtual uint8_t getAddress(void) = 0;

};

template <class T, uint8_t address>
class TypedRegister : public Register
{
  public:

    TypedRegister::TypedRegister() : reg_address(address){}
    bool read(void);
    bool write(uint8_t data);
    uint8_t getData(void);
    uint8_t getAddress(void);
    
  private:

    const uint8_t reg_address;
    T data;

};

将I / O扩展器中的所有寄存器都放在一个数组中对我来说很方便。问题是我无法以这种方式定义数组以避免动态分配内存。数组定义

static constexpr uint8_t no_regs_in_expander = 18;
Register register_map[no_regs_in_expander];

不起作用,因为Registeris是抽象类,所以唯一的可能性是以这种方式定义数组

static constexpr uint8_t no_regs_in_expander = 18;
Register* register_map[no_regs_in_expander];

但这意味着我需要通过new运算符来创建各个寄存器的实例,这在我的平台上是禁止的。是否有可能实现所有寄存器都可以位于一个数组中并且实例被静态分配的状态?在此先感谢你的建议。

Questioner
L3sek
Viewed
0
Daniel Langr 2020-12-03 00:57:18

动态多态与动态内存分配无关。你可以具有某个派生类的静态分配的对象,并将其地址分配给指向基址的指针。在你的情况下,它可能如下所示:

Register* register_map[2];

TypedRegister<int, 0> obj1;
TypedRegister<long, 1> obj2;

register_map[0] = &obj1;
register_map[1] = &obj2;

for (ptr : register_map)
  ptr->write(0);