c++ - 使用非类型模板参数而不是常规参数的原因?

标签 c++ templates

在 C++ 中,您可以使用非类型模板参数创建模板,如下所示:

template< int I >
void add( int& value )
{
  value += I;
}

int main( int argc, char** argv )
{
  int i = 10;
  add< 5 >( i );
  std::cout << i << std::endl;
}

将“15”打印到 cout。这有什么用?是否有任何理由使用非类型模板参数而不是更传统的参数,例如:

void add( int& value, int amount )
{
  value += amount;
}

对不起,如果这已经被问到了(我看了但找不到任何东西)。

最佳答案

非类型模板参数有很多应用;这里有一些:

您可以使用非类型参数来实现表示固定大小的数组或矩阵的泛型类型。例如,您可以参数化 Matrix输入其尺寸,因此您可以制作 Matrix<4, 3>Matrix<2, 2> .如果随后为这些类型正确定义重载运算符,则可以防止因添加或乘以不正确维度的矩阵而导致的意外错误,并且可以使函数明确传达它们接受的矩阵的预期维度。这可以通过在编译时检测违规来防止发生大量运行时错误。

您可以使用非类型参数通过模板元编程实现编译时函数评估。例如,这是一个在编译时计算阶乘的简单模板:

template <unsigned n> struct Factorial {
    enum { 
       result = n * Factorial<n - 1>::result
    };
};
template <> struct Factorial<0> {
    enum {
       result = 1
    };
};

这允许您编写像 Factorial<10>::result 这样的代码在编译时获得 10! 的值。这可以防止在运行时执行额外的代码。

此外,您可以使用非类型参数来实现 compile-time dimensional analysis ,它允许您定义公斤、米、秒等的类型,以便编译器可以确保您不会在您的意思是米等的地方意外使用公斤。

希望这会有所帮助!

关于c++ - 使用非类型模板参数而不是常规参数的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395700/

相关文章:

C++ std::regex 正则表达式查找多个匹配项

c++ - 升级到 ubuntu 17.10(以及 Fedora)后,qDebug() 停止工作(不再打印到控制台)

c++ - wxWidgets 中的命令行参数

c++ - 默认模板参数

c++ - 表达三元条件的结果类型 `?:`

c++ - 模板对象可以改变它的类型吗?

c++ - 使用光流的 OpenCV 跟踪

c++ - 运算符[][] 重载

C++ 获取可变参数模板参数包中参数的并集?

c++ - 如何对可变参数模板参数进行预增量?