我想这更多的是一个设计问题。如果这不是在正确的地方,请原谅我。假设我有一个类,它表示系统的总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存储体。但是,我觉得这可能会让用户感到困惑,并且违反了最小惊讶原则,因为人们期望模板参数指定总RAM的大小,而不是RAM库的大小:
Ram<0x2000> work_ram; // 4 KB total of work RAM? (no, 4 KB per bank)总RAM在运行之前是未知的,只有存储体的大小是已知的。这个问题的解决方案是什么?
发布于 2019-08-04 09:06:17
您可以使Bank类型定义成为独立的模板,然后让Ram模板接受Bank作为其模板参数。即:
template <uint16_t SIZE>
using RamBank = std::array<uint8_t, SIZE>;
template <typename Bank>
class Ram
{
public:
//...
private:
std::vector<Bank> data_;
};然后使用它作为
Ram<RamBank<0x2000>> work_ram;这让我很清楚,work_ram是一个2KB的银行集合。
https://stackoverflow.com/questions/57342940
复制相似问题