我正在实现一个名为FingerprintBuffer
的用于存储指纹的类。每个指纹实质上只是一个字节数组。每个指纹的大小和缓冲区的容量在编译时固定和已知。我有两个选择:
模板化参数:
template <int FNGPRT_SIZE, int BUFFER_CAP>
class FingerprintBuffer {
public:
FingerprintBuffer() {
buff_ = new char[FNGPRT_SIZE * BUFFER_CAP]();
size_ = 0;
}
private:
char* buff_;
int size_;
};
FingerprintBuffer<36, 300> fngprt_buff;
或构造函数参数:
class FingerprintBuffer {
public:
FingerprintBuffer(int fngprt_sz, int buff_cap) {
fngprt_sz_ = fngprt_sz;
buff_cap_ = buff_cap
buff_ = new char[fngprt_sz_ * buff_cap_]();
size_ = 0;
}
private:
int fngprt_sz_;
int buff_cap_;
char* buff_;
int size_;
};
FingerprintBuffer fngprt_buff(36, 300);
我应该选择哪个选项?一般来说,我应该在哪种条件/假设下选择模板参数而不是施工参数?
答案 0 :(得分:2)
我可以给你一个常用的用法。也就是说,如果FNGPRT_SIZE
之类的参数在运行时中不会更改,则可以使用模板参数。如果您的参数将在运行时更改,则必须使用函数参数。
此外,模板参数还可以节省内存(结构体较小)并通过编译器获得const number优化。
通常,模板参数还可以为您提供编译时检查。如果实现矩阵多重播放,则可以将模板参数与static_assert(COL_NUM, ROW_NUM)
一起用于两个矩阵。您可以尽早发现错误。