什么时候应该使用模板化参数而不是构造参数?

时间:2019-06-03 02:33:58

标签: c++ c++11 templates

我正在实现一个名为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);

我应该选择哪个选项?一般来说,我应该在哪种条件/假设下选择模板参数而不是施工参数?

1 个答案:

答案 0 :(得分:2)

我可以给你一个常用的用法。也就是说,如果FNGPRT_SIZE之类的参数在运行时中不会更改,则可以使用模板参数。如果您的参数将在运行时更改,则必须使用函数参数。

此外,模板参数还可以节省内存(结构体较小)并通过编译器获得const number优化。

通常,模板参数还可以为您提供编译时检查。如果实现矩阵多重播放,则可以将模板参数与static_assert(COL_NUM, ROW_NUM)一起用于两个矩阵。您可以尽早发现错误。