尝试将非常量变量作为模板参数传递时(例如以下代码片段中的 i),编译器会出现问题错误:
<code class="cpp">template <int a> void modify() {} for (int i = 0; i < 10; i++) { modify<i>(); // error: 'i' cannot appear in constant-expression }</code>
错误原因:
模板在编译期间扩展,这需要在编译时评估其参数。由于 i 在循环内被修改,编译器无法在编译时确定其值,从而导致错误。
替代实现:
无需实现所需的迭代更改 API 接口,请考虑实现以下内容:
<code class="cpp">#include <iostream> template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; } template<int x, int to> struct static_for { void operator()() { modify<x>(); static_for<x+1,to>()(); } }; template<int to> struct static_for<to,to> { void operator()() {} }; int main() { static_for<0,10>()(); }</code>
此版本利用递归来模拟迭代。通过为每个值实例化专门的模板函数(例如,modify、modify 等),代码模拟从 i=0 到 i=9 的循环行为。
Non - 常量模板参数解析:
要使用可变参数 VAR(由函数计算确定)调用修改,请考虑使用带有可变参数的模板函数,如下所示:
<code class="cpp">template <typename T> void modify(const T& x) { std::cout << "modify(" << x << ")" << std::endl; } int main() { auto VAR = ...; // computed from some functional process modify(VAR); }</code>
以上是为什么我不能在 C 中使用非常量变量作为模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!