gpt4 book ai didi

c++ - 无法在循环中实例化泛型函数

转载 作者:行者123 更新时间:2023-11-30 03:26:41 26 4
gpt4 key购买 nike

我有一些通用函数,看起来类似于

template<int P>
struct foo {
static const int value = ...;
};

现在,我想在循环中调用这个通用函数。像这样:

for (int i = 0; i < 100; ++i)
{
auto bar = foo<i>::value;
}

但是我收到了很多错误信息。喜欢

the value of 'i' is not used in a constant expression

int i is not constant

我尝试用以下方法修复它:

foo<(const int)i>::value;

但是没有用。那么,这有什么问题,我该如何让它发挥作用?

最佳答案

你不能这样做。

for (int i = 0; i < 100; ++i)
{
auto bar = foo<i>::value;
}

i 需要一个常量表达式,以便编译器在编译您的程序时为其生成代码。

以下是常量表达式的详尽解释: http://en.cppreference.com/w/cpp/language/constant_expression


这是该网站的一个片段:

int n = 1;
std::array<int, n> a1; // error: n is not a constant expression
const int cn = 2;
std::array<int, cn> a2; // OK: cn is a constant expression

因此,要使其在编译时发生,您需要使用可变参数模板将循环变成模板递归。

如果你读了这个例子,也许你可以理解你需要做的更好:

// Example program
#include <iostream>
#include <string>

template<int P>
struct foo
{
static const int value = P;
};

template <int TIndex>
int call()
{
return foo<TIndex>::value;
}

template <int TIndex, int TIndex2, int ...Rest>
int call ()
{
return call<TIndex>() + call<TIndex2, Rest...>();
}

int main()
{
std::cout << "Test: " << call<1, 2>() << "\n"; // prints "Test: 3"
}

Nicky C 发布了另一个问题的链接。它有一个很好的答案,我觉得在这里复制它不合适。看看我上面的工作示例,然后看看这里的答案:

https://stackoverflow.com/a/11081785/493298

您应该能够让它发挥作用。这有点像语法 hell ,但我敢肯定,您可以管理它。

关于c++ - 无法在循环中实例化泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48109517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com