是否可以使用元编程将所有常规编程任务转换为编译时间?

时间:2011-01-23 23:01:48

标签: c++ metaprogramming

我读到了关于元编程的内容,发现它非常有趣。例如,检查数字是否为素数,计算斐波纳契数...我对其实际用法感到好奇,如果我们可以将所有运行时解决方案转换为元编程,那么应用程序的执行效果会更好。让我们说找到一个数组的最大值。如果没有排序,我们将在运行时采用O(n)。是否可以通过元编程获得O(1)?

谢谢,

4 个答案:

答案 0 :(得分:5)

你不能因为元编程只适用于编译时已知的输入。因此,您可以使用一个元函数来计算斐波纳契数,给定编译时已知的常数:

int value = Fibonacci<5>::Value;

但它不适用于用户在运行时输入的值:

int input = GetUserInput();
int value = Fibonacci<input>::Value; // Does not compile

当然,每次获得新值时都可以重新编译程序,但这对于非平凡的程序来说是不切实际的。

请记住,C ++中的元编程基本上是对C ++处理模板的方式的“有用的偶然滥用”。在C ++ 0x之前创建C ++标准时,模板元编程绝对不是 C ++标准委员会所考虑的内容。你只能推动编译器这么多,直到你得到内部编译器错误(现在已经改变了更新的编译器,但你仍然不应该过分)。

如果你想了解它们真正有用的内容,那就有一本(高级)书dedicated to C++ template metaprogramming

答案 1 :(得分:5)

如果在编辑按钮时不知道,那么元编程就无法解决这个问题。

答案 2 :(得分:2)

如果你在谈论处理编译时已知的数据(而不是在运行时已知),那么从理论上讲,是的。

在实践中,没有。任何非平凡的任务很快就会成为难以理解的模板代码的混乱噩梦,当它们编译失败时会发出更多难以理解的错误消息。此外,大多数C ++编译器在爆炸之前只能容忍一定深度的模板嵌套。

答案 3 :(得分:2)

不确定。当然,你不能进行任何系统调用,所有用户都需要一个编译器来运行你的程序,用户输入必须采取定义常量表达式的形式,但是...如果你真的,真的很想你就可以在C ++模板代码中编写任何程序,以便在编译期间“运行”而不是运行时。