Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否在编译时计算模板参数?_C++ - Fatal编程技术网

C++ 是否在编译时计算模板参数?

C++ 是否在编译时计算模板参数?,c++,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 dim

我知道模板是一个编译时构造,但我现在要问自己的是:假设我有以下函数

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");

}
void caller1(){
功能(1);
}
void caller2(){
功能(2);
}
void caller3(){
功能(3);
}
虚函数(整数维){
如果(尺寸3)
抛出超出范围的阴影(“错误的阴影”);
}

该检查在运行时并没有太大的延迟,但我想知道是否可以用一个带有“int-dimensions”的模板函数替换该函数模板的参数:我的问题是,这是否可以在编译时解决,并为调用者中调用的所有三个函数生成代码

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

可以修改构造以执行编译时计算,但这不会导致运行时错误(异常),而是编译错误:

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

只要
dimensions
参数在编译时总是已知的,这就行了。有关使用模板而非通常的“使此容器灵活”的一些说明,请参阅。

就我所知,您的问题不涉及任何模板参数?!?所以答案是否定的。Tom和Nikos的答案都没有这样说,即使他们解释了为什么它在你的情况下不起作用。@πάνταῥεῖ 但是格式是这样的,它可以很容易地被模板化的表单替换,这正是用户所要求的。当然,如果使用模板专门化,则需要代码重复或辅助模板(仍有一些重复);如果C++11或更高版本可用,并且检查可以在编译时进行,则可能是最佳选择。@BenjaminLindley:“我的问题是,这是否可以在编译时解决,并为调用方调用的所有三个函数生成代码”。。。他希望避免在运行时检查维度,而是希望将其作为模板参数传递。。。但是维度是作为参数传递到函数中的,所以在编译时它是未知的。为不必要地升高温度而道歉。不应typename@sam为了纠正错误(快速书写->愚蠢的错误),您还可以执行
template……函数(N)…
对吗?这样你就可以像在原始代码中那样调用函数(2)。@Spundun-Nope。该值不能导致模板参数的推断,只能导致函数参数的类型。是的,这是字面意思,但在runtime@NikosAthanasiou谢谢现在我再仔细想想,这是有道理的。如果我们决定以这种方式推导N,那就像说你只能传递文本作为参数,永远不能传递变量。那可不好。
function<2>(); // OK
function<5>(); // compilation error