int vec[s_maxSize];
is actually illegal in the second example, so that is not possible to do in C++. But your first example is perfectly legal C++0x.
So there’s your answer. You can’t actually do what you propose in C++. It can only be done in C++0x with constexpr
.
I would also like to point out, that this code also works in C++0x. Doing this in C++ would require some really fancy class templates.
constexpr unsigned int gcd(unsigned int const a, unsigned int const b)
{
return (a < b) ? gcd(b, a) : ((a % b == 0) ? b : gcd(b, a % b));
}
char vec[gcd(30, 162)];
Of course, in C++0x you still have to use the ternary operator instead of if statements. But, it works and is still a lot easier to understand than the template version you’d be force to use in C++:
template <unsigned int a, unsigned int b>
class gcdT {
public:
static unsigned int const value = gcdT<b, a % b>::value;
};
template <unsigned int a>
class gcdT<a, 0> {
public:
static unsigned int const value = a;
};
char vec[gcdT<30, 162>::value];
And then, of course, in C++ you’d still have to write the gcd
function if you needed to compute things at runtime because the template can’t be used with arguments that vary at runtime. And C++0x would have the additional optimization boost of knowing that the result of the function is completely determined by the passed in arguments, which is a fact that can only be expressed with compiler extensions in C++.