首页 > 后端开发 > C++ > 正文

为什么我不能在 C 中使用非常量变量作为模板参数?

Susan Sarandon
发布: 2024-10-29 08:53:30
原创
671 人浏览过

 Why can't I use a non-constant variable as a template argument in C  ?

非常量模板参数难题

尝试将非常量变量作为模板参数传递时(例如以下代码片段中的 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板