Jacobian
Jacobian

Reputation: 10802

Unable to instantiate generic function in a loop

I have some generic function, which looks similar to

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

Now, I want to call this generic function in a loop. Like so:

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

But I get a lot of error messages. Like

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

int i is not constant

I tried to fix it with:

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

But to no avail. So, what is wrong with that and how can I make it work?

Upvotes: 1

Views: 101

Answers (1)

0xbaadf00d
0xbaadf00d

Reputation: 2643

You cannot do it this way.

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

i needs to me a constant expression, so that the compiler can generate the code for it when it compiles your program.

Here's an exhaustive explanation of what constant expressions are: http://en.cppreference.com/w/cpp/language/constant_expression


Here's a segment from the site:

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

So to make it happen compile time, you need to make your loop into a template recursion using variadic templates.

Maybe you can understand what you need to do better if you read this example:

// 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 posted a link to another question. It has a good answer and I don't feel right in copying it here. Take a look at my working example above and then look at the answer here:

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

You should be able to make it work. It's a bit of a syntax hell, but you can manage it, I'm sure.

Upvotes: 2

Related Questions