C++ 如何处理模棱两可的模板参数?

C++ 如何处理模棱两可的模板参数?,c++,oop,templates,design-patterns,api-design,C++,Oop,Templates,Design Patterns,Api Design,我想这更像是一个设计问题。如果这不在正确的地方,请原谅我。假设我有一个类,它表示一个系统的总RAM,分为若干组: template <uint16_t bank_sz> class Ram { constexpr static auto BANK_SIZE = bank_sz; using Bank = std::array<uint8_t, BANK_SIZE>; public: uint8_t read(uint8_t bank, u

我想这更像是一个设计问题。如果这不在正确的地方,请原谅我。假设我有一个类,它表示一个系统的总
RAM
,分为若干组:

template <uint16_t bank_sz>
class Ram
{
    constexpr static auto BANK_SIZE = bank_sz;
    using Bank = std::array<uint8_t, BANK_SIZE>;

    public:
    uint8_t read(uint8_t bank, uint16_t adr) const;
    void write(uint8_t b, uint8_t bank, uint16_t adr);
    void dump(std::ostream &os) const;

    private:
    std::vector<Bank> data_ {};
};
模板
类Ram
{
constexpr静态自动银行规模=银行规模;
使用Bank=std::数组;
公众:
uint8_t read(uint8_t bank,uint16_t adr)const;
无效写入(uint8\u t b、uint8\u t bank、uint16\u t adr);
无效转储(标准::ostream&os)常数;
私人:
std::矢量数据{};
};
模板存在,因此用户可以指定内存组的大小,因为系统可能具有不同大小的RAM内存组。但是,我觉得这可能会让用户感到困惑,并且违反了最不意外的原则,因为人们希望模板参数指定总RAM的大小,而不是RAM库的大小:

Ram<0x2000> work_ram; // 4 KB total of work RAM? (no, 4 KB per bank)
Ram工作\u Ram;//总工作内存为4KB?(否,每家银行4KB)

总RAM直到运行时才知道,只有库的大小才知道。解决这个问题的方法是什么?

您可以将
Bank
typedef作为一个独立的模板,然后让
Ram
模板将
Bank
作为其模板参数。i、 e:

template <uint16_t SIZE>
using RamBank = std::array<uint8_t, SIZE>;

template <typename Bank>
class Ram
{
public:
    //...

private:
    std::vector<Bank> data_;
};
模板
使用RamBank=std::array;
模板
类Ram
{
公众:
//...
私人:
std::矢量数据;
};
然后将其用作

Ram<RamBank<0x2000>> work_ram;
Ram工作\u Ram;

这让我非常清楚,
work\u ram
是一个2KB银行的集合。

文档…将类重命名为
RamBank
。由于真实的计算机系统可以有多个RAM库,所以总RAM将是一个库的大小与该类型库的数量的乘积(根据您的描述,可能是在运行时设置的)。如果需要,这也可以推广到具有多种RAM库的系统(如哈佛体系结构计算机)。