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
之间的差异来回答的。最重要的是一个大小是编译时常量,而另一个则不是。