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

标签 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);

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

最佳答案

我可以给你一个常见的用法。也就是说,如果像 FNGPRT_SIZE 这样的参数在运行时不会改变,则可以使用模板参数。如果参数在运行时会改变,则必须使用函数参数。

此外,模板参数可以节省内存(结构尺寸更小)并通过编译器获得常量优化。

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

关于c++ - 我什么时候应该使用模板化参数而不是构造参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56420526/

相关文章:

c++ - 主窗口类外的连接槽

c++ - 静态、堆栈和堆内存分配中的地址排序?

c++ - 使用 std::vector<T*> 是否不如 std::vector<shared_ptr<T>> 安全?

c++ - 谁能解释一下这个 C++ 程序。结果很奇怪 :(

c++ - 从模板化类中提取类型

c++ - 在同一个头文件中定义但在类外部的模板构造函数未被识别

css - 如何在不对抗 CSS 的情况下实现这种布局

c++ - C++ 中是否有半环或幺半群的标准抽象?

c++ - 为什么 operator[] 必须是非静态成员函数?

c++ - CRTP + enable_if 的好友功能不起作用?