模板元编程可用于在编译时而不是在运行时计算诸如阶乘的事物。我听说一些编程竞赛对编译时间的限制正是为了清除模板元编程滥用。
是否有任何无辜的使用模板的示例需要花费一些非常长的时间(如几个小时)来编译?
答案 0 :(得分:5)
模板机制是Turing-complete。这意味着至少在理论上,任何可以完成的计算都可以在编译时以这种方式完成(实际上,您可能会很快遇到模板深度等硬限制,但这取决于编译器)。
您是否想要这样做是一个单独的问题。通过使用昂贵的算法,您可以轻松地匹配“编译小时”的标准。但是还有更实用的代码,如this one implementing an FFT;给一个足够大的数据集,这需要一段时间......
答案 1 :(得分:4)
我听说国际信息学奥林匹克(一个这样的编程竞赛)在参赛者使用类似this的技术创建7维向量之后首先引入了编译时间限制。他的代码不得不在一夜之间编译它是如此糟糕。我想这发生在90年代后期的一段时间。
答案 2 :(得分:3)
试试这个(我使用的是Visual Studio 2005)
template <int M, int N>
struct Ack
{
enum { value = Ack<M - 1, Ack<M, N - 1>::value >::value };
};
template <int M>
struct Ack<M, 0>
{
enum { value = Ack<M - 1, 0>::value };
};
template <>
struct Ack<0, 0>
{
enum { value = 1 };
};
template <int N>
struct Ack<0, N>
{
enum { value = N + 1 };
};
void main()
{
printf("Result: %d\n", Ack<150, 150>::value);
}
它可能看起来很可怕,我只是试着写一个等同于这个可爱的lisp函数
(defun ack(m, n)
cond ((= m 0) (+ n 1))
((= n 0) ack(- m 1) n)
(t (ack (- m 1) (ack m (-n 1))) )
)
我们的老师说这是Ferma功能,但我不确定......