我有一些通用功能,看起来类似于
template<int P>
struct foo {
static const int value = ...;
};
现在,我想在循环中调用这个泛型函数。像这样:
for (int i = 0; i < 100; ++i)
{
auto bar = foo<i>::value;
}
但是我收到了很多错误信息。像
'i'的值不用于常量表达式
int i不是常数
我尝试用以下方法修复它:
foo<(const int)i>::value;
但无济于事。那么,这有什么问题,我怎么能让它发挥作用呢?
答案 0 :(得分:2)
你不能这样做。
for (int i = 0; i < 100; ++i)
{
auto bar = foo<i>::value;
}
我需要一个常量表达式,以便编译器在编译程序时可以为它生成代码。
这是对常量表达式的详尽解释: 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
你应该能够让它发挥作用。这有点像语法地狱,但你可以管理它,我确定。