不要打扰。它不兼容。它很混乱且容易出错。早在此功能存在之前,c++ 就有更容易管理的解决方案。您在结构的末尾添加了什么?通常,您只需使用 std::vector、std::array 或固定大小数组之类的东西。
更新
我想要一个音符开始时间列表(uint64_t)并遍历它们以查看正在播放的(如果有的话)。我打算在结构中添加一个计数变量来跟踪灵活数组中有多少项目。
好的,如果您有固定的复音,那么固定大小的数组应该没问题。在大多数 iOS 合成器中,您不需要多个这样的数组。当然,“即将到来的笔记”数组大小可能会因应用合成器而异?采样器?定序器?现场输入?
template <size_t NumNotes_>
class t_note_start_times {
public:
static const size_t NumNotes = NumNotes_;
typedef uint64_t t_timestamp;
/*...*/
const t_timestamp& timestampAt(const size_t& idx) const {
assert(this->d_numFutureNotes <= NumNotes);
assert(idx < NumNotes);
assert(idx < this->d_numFutureNotes);
return this->d_startTimes[idx];
}
private:
t_timestamp d_presentTime;
size_t d_numFutureNotes; // presumably, this will be the number of active notes,
// and values will be compacted to [0...d_numFutureNotes)
t_timestamp d_startTimes[NumNotes];
};
// in use
const size_t Polyphony = 16;
t_note_start_times<Polyphony> startTimes;
startTimes.addNoteAtTime(noteTimestamp); // defined in the '...' ;)
startTimes.timestampAt(0);
如果您需要一个可能非常大的动态大小的数组,请使用向量。如果您只需要一个实例并且最大复音数是(比如说)64,那么就使用它。