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

时间:2014-06-06 15:08:08

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

}

该检查在运行时并不是一个很大的延迟,但我想知道我是否可以用带有&#34; int维度的模板化函数替换该函数&#34;模板的参数:我的问题是,是否可以在编译时解决并为调用者中调用的所有三个函数生成代码

2 个答案:

答案 0 :(得分:7)

如果表达式不是评估的编译时间,则它不能是模板参数。

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

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

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

function<2>(); // OK
function<5>(); // compilation error

答案 1 :(得分:2)

只要在编译时始终知道dimensions参数,那就可行。有关使用模板的一些说明,请参阅http://eli.thegreenplace.net/2011/04/22/c-template-syntax-patterns/,而不是通常的#34;使此容器变得灵活&#34;。