是否在编译时评估模板参数?

use*_*506 5 c++

我知道模板是一个编译时构造,但我现在问的是:假设我有以下功能

void caller1() {
  function(1);
}
void caller2() {
  function(2);
}
void caller3() {
  function(3);
}

void function(int dimensions) {

  if(dimensions <= 0 || dimensions > 3)
     throw out_of_range("Wrong dims");

}
Run Code Online (Sandbox Code Playgroud)

那个检查在运行时不是很大的延迟,但我想知道我是否可以用模板化的"int dimensions"参数替换该函数:我的问题是,如果在编译时解决这个问题并生成代码调用者中调用的所有三个函数

Nik*_*iou 7

如果表达式未计算编译时间,则它不能是模板参数.

可以修改您的构造以执行编译时评估,但这不会导致运行时错误(异常),但会导致编译错误:

template<int N>
typename std::enable_if<(N>0 && N<=3)>::type function() {
     // stuff     
}
Run Code Online (Sandbox Code Playgroud)

但是这需要N在编译时知道维度,因此你可以像这样调用函数:

function<2>(); // OK
function<5>(); // compilation error
Run Code Online (Sandbox Code Playgroud)


Tom*_*ing 2

只要dimensions参数在编译时始终已知,那就可以了。请参阅http://eli.thegreenplace.net/2011/04/22/c-template-syntax-patterns/,了解以不同于通常的“使此容器灵活”的方式使用模板的一些描述。