C++ 何时应使用模板参数与构造参数?
我正在实现一个名为C++ 何时应使用模板参数与构造参数?,c++,c++11,templates,C++,C++11,Templates,我正在实现一个名为FingerprintBuffer的类,用于存储指纹。每个指纹本质上只是一个字节数组。每个指纹的大小和缓冲区的容量在编译时是固定的和已知的。我有两个选择: 模板参数: template <int FNGPRT_SIZE, int BUFFER_CAP> class FingerprintBuffer { public: FingerprintBuffer() { buff_ = new char[FNGPRT_SIZE * BUFFER_CAP]();
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);
我应该选择哪一个?一般来说,在哪些条件/假设下,我应该选择模板参数而不是构造参数?我可以给你一个常见用法。也就是说,如果像
FNGPRT\u SIZE
这样的参数在运行时不会更改,则可以使用模板参数。如果您的param将在运行时更改,则必须使用函数param
此外,模板参数可以节省内存(结构大小更小),并通过编译器获得常量数优化
通常,模板参数还可以给您一个编译时检查。如果您实现了一个矩阵多重播放,您可以对两个矩阵使用模板参数和
static\u assert(COL\u NUM,ROW\u NUM)
。你可以在早期发现错误。模板化类的明显优点:你不需要存储fngprt\u sz\u
和buff\u cap\u
,如果需要,你可以进行一些预处理计算(顺便说一句,看起来不是这样)。明显的缺点:如果按大小或容量有很多不同的指纹,编译时间会更长,需要更多的代码来提供不同类型的指纹操作。例如,std::array
的大小是固定的,因为它是在堆栈上分配的,不在堆上。在第一个示例中,您没有利用值是常量这一事实buff\uu
可以是一个静态数组(char buff\ufngprt\u SIZE*BUFFER\u CAP]
)这个问题基本上是通过理解std::array
和std::vector
之间的差异来回答的。最重要的是一个大小是编译时常量,而另一个则不是。