我最近在元编程变得流行的时候广泛使用了C ++,我现在才回来。我过去做过一堆脚本化的C ++代码生成。虽然我看到元编程功能强大,它是否真正提供了脚本代码生成的任何功能?我看到的一个优点是脚本不是“往返”,其中元编程与源代码一致,因此非运行时代码和运行时代码之间总是存在同步性。
答案 0 :(得分:7)
你已经得到了一些提及类型安全性的答案, 是一个很好的理由 - 但它绝对不是唯一的。使用脚本生成代码的一个大问题是它在整个构建周期中难以分发,并且所有程序员都使用它。也就是说,即使给出了一个工作脚本,程序员使用脚本也必须合理地意识到它的存在。必须编写构建周期以了解脚本,并且使用脚本生成的代码进行调试往往也相对困难,因为您调试的代码既不是您也不是其他人实际编写的代码。脚本生成的代码很少编写,就像普通人写同样的东西一样,使调试变得更加困难。
元编程往往会集中精力 - 但即使写入起来很困难,使用通常也很简单。就调试而言,它取决于:模板代码可以被编写为在编译时静态检查其参数,并且(至少尝试)在/如果使用不正确时产生有意义的错误消息。当然,有些不是,就像某些函数接受它们的输入并尝试使用它们而不检查所提供的输入是否满足其要求。
同时,一旦编写了模板代码,使用它通常完全直截了当。事实上,由于模板通常必须在标题中,因此复杂的元编程往往是最简单的代码,可以合并到最终产品中。通常你要做的就是包括正确的标题;您甚至不必为链接器指定库。
这往往更符合程序员之间真正的人才分布。 少数程序员比其他程序员要好得多。使用TMP,您有更好的机会让一些真正精湛的程序员编写复杂的TMP代码,并使所有普通程序员的生活变得更加轻松。使用脚本代码生成,您基本上期望所有参与者拥有几乎相同级别的人才。使用该脚本,编写与脚本生成的代码集成的其他代码等等都是同样困难的,所以你基本上需要所有你的程序员都很好,并且几乎不能做到尽可能多地利用一些优秀的程序员为其他人提供便利。
答案 1 :(得分:3)
来自维基百科:
元编程是写作的 写或的计算机程序 操纵其他程序(或 他们自己)作为他们的数据[...]
如果你想拆分头发,那么脚本驱动的代码生成是元编程。
使用模板的内置功能进行C ++元编程的优点是可以获得C ++强类型系统的好处。
答案 2 :(得分:2)
我的意见?
关于元编程的事情是它是类型安全的。宏和自动生成的代码都不知道语言规则。答案 3 :(得分:1)
[元编程]真的提供了比脚本代码生成更多的东西吗?
看一下我的以下元程序。
它会为operator<<
的任何数组重载T
,除非T
是char
类型。
(没有这种预防措施,字符串文字的输出将不再起作用。)
template <typename T, size_t n>
typename disable_if<
is_same<typename remove_const<T>::type, char>::value,
std::ostream&
>::type
operator<<(std::ostream& os, T (&array)[n])
{
return print_range(os, array + 0, array + n);
}
那么你如何“编写”这个元程序呢?为每种可能的类型T
生成实际代码?这是不可行的,因为你不知道“脚本时间”在编译时会存在哪些类型。