在 C 中,模板参数必须是常量表达式。这意味着它们的值必须在编译时已知。编译器无法在此上下文中计算非常量变量。
考虑以下代码:
<code class="cpp">template <int a> void modify(){}</code>
要传递非常量变量作为模板参数,我们可以编写:
<code class="cpp">for(int i = 0; i < 10; i++) { modify<i>(); }</code>
但是,这会触发错误,因为编译器无法在编译时确定 i 的值。循环体可能会执行多次,改变i的值。
我们可以使用模板特化来实现,而不是直接传递非常量变量迭代调用:
<code class="cpp">#include <iostream> template<> void modify<0>() { std::cout << "modify<0>" << std::endl; } template<> void modify<1>() { std::cout << "modify<1>" << std::endl; } // ... template<int i> void modify() { std::cout << "modify<" << i << ">" << std::endl; modify<i+1>(); } int main() { modify<0>(); }</code>
要使用编译时未知的值调用修改,我们可以使用一种称为模板元编程的技术。这是一个简化的示例:
<code class="cpp">#include <tuple> template <std::tuple<int...>> struct TupleSize; template <int... Args> struct TupleSize<std::tuple<Args...>> { static const int value = sizeof...(Args); }; template <int N> void callModify(int i) { if constexpr (i < N) { modify<i>(); callModify<N>(i+1); } } int main() { int n = 10; callModify<TupleSize<std::make_tuple(1,2,3,4,5,6,7,8,9,10)>::value>(0); }</code>
在此示例中,callModify 采用参数 N,该参数是包含 i 所需值范围的元组的大小。该函数使用递归元程序生成调用以修改至指定大小 N。
以上是为什么非常量变量不能用作 C 中的模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!