【发布时间】:2016-11-26 16:27:54
【问题描述】:
我的目标是在编译时计算阶乘数组,而不创建任何类对象或调用静态函数。这是最少的代码:
#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,在静态构造时计算阶乘并初始化数组,not 在编译时。我想你可能需要在周围撒一些
constexprs。
标签: c++ templates c++11 compile-time