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

时间:2018-01-05 08:07:20

标签: c++

我有一些通用功能,看起来类似于

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;

但无济于事。那么,这有什么问题,我怎么能让它发挥作用呢?

1 个答案:

答案 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

你应该能够让它发挥作用。这有点像语法地狱,但你可以管理它,我确定。