我的目标是在编译时计算阶乘数组而不创建任何类对象或调用静态函数。下面是最少的代码:计算编译时数组时编译器相关的错误
#include <iostream>
#include <cinttypes>
#include <array>
namespace CompileTime
{
enum {MaxFactorial = 10};
template<size_t N, size_t I = N-1>
class Factorial : public Factorial<N, I-1>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,1> : public Factorial<N, 0>
{
public:
static const uint64_t value;
};
template<size_t N>
class Factorial<N,0>
{
public:
static const uint64_t value;
static std::array<uint64_t,N> array;
};
template<size_t N>
const size_t Factorial<N,1>::value = Factorial<N,0>::array[1] = 1;
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
template <size_t N, size_t I>
const size_t Factorial<N,I>::value = Factorial<N,0>::array[I] =
I * Factorial<N, I-1>::value;
template <size_t N>
std::array<uint64_t,N> Factorial<N, 0>::array;
template class Factorial<MaxFactorial>;
typedef Factorial<MaxFactorial> PrecomputerFactorial;
}
int main()
{
using CompileTime::PrecomputerFactorial;
for(auto x : PrecomputerFactorial::array)
std::cout << x << std::endl;
std::cout << std::endl;
}
与GCC 5.3.0编译提供计划输出:
0
1
2
6
24
120
720
5040
40320
362880
而且随着MSVC 2015年:
0
1
0
0
0
0
0
0
0
0
我有两个问题:一是 ,为什么array[0]
具有价值0
在这两种情况下,尽管被设置为1
这里:
template<size_t N>
const size_t Factorial<N,0>::value = Factorial<N,0>::array[0] = 1;
二,为什么MSVC 2015年无法计算呢?
不能回答这两个问题的观察:对于GCC 6,计算阶乘并在静态构建时初始化数组,不在编译时。我想你可能需要在周围洒一些'constexpr'。 – zwol