模板循环需要const值

时间:2016-09-27 20:28:30

标签: c++ templates

如何使编译时已知的const参数在以下代码中用作模板参数?

错误:

test.cpp(13): error: expression must have a constant value
      loop<nd>();

代码:

#include <iostream>
template <int Depth>
inline void loop(void){
    std::cout << Depth;
    loop<Depth - 1>();
}
template <>
inline void loop<0>(void){
    std::cout << "end" <<std::endl;
}

inline void broadcast_loop(const int nd){
    loop<nd>();
}

int main(void){
    const int nd = 3;
    broadcast_loop(nd);
}

2 个答案:

答案 0 :(得分:2)

你不能这样做,因为C ++类型系统不够强大,不能让你这样做。没有办法强制传递给broadcast_loop的参数是常量表达式编译时常量),因此编译器不允许你使用参数作为模板参数。

您只需直接从loop<nd>()致电main(),或者broadcast_loopnd作为模板参数。

答案 1 :(得分:1)

函数的参数永远不能按照你描述的方式使用,因为函数的定义永远不能证明在所有调用上下文中函数的参数是一个常量表达式。你真正想要的是constexpr,而不是const,但你不能constexpr函数参数(因为我刚才描述的原因)。你可以做的是在模板中传递整数:

template <int nd>
inline void broadcast_loop(){
    loop<nd>();
}

int main(void){
constexpr int nd = 3;
broadcast_loop<nd>();

}

请注意我的main我需要constexpr,而不只是const