C++模板的替代品?

ano*_*non 6 c++ metaprogramming

我认为元编程非常酷.特别是,我喜欢lisp宏.

但是,我认为C++模板很糟糕,因为:
1.它们减慢了编译时间(即使使用预编译的头文件,如果包含任何STL内容,最终会大50MB).
2.他们给那些counintuitive可怕的编译器/语法错误
3.他们没有desinged在首位复杂的元编程(产生comipler误差为素数/显示模板在当天图灵完备是一个大问题回).

说了这么多,C++元编程有一个不错的选择吗?就像是

*.m - >元编译器 - >*.cpp - > g ++ - >可执行文件?

编辑:

我正在沿着"自定义代码生成脚本"的方向发展.我只是想知道那里是否有非常好的一套.

Any*_*orn 7

我不确定这应该是什么,我使用代码生成器来生成C++代码.特别是python猎豹.你基本上直接嵌入Python代码你的C++代码中,并通过猎豹preprocessor.it允许做非常复杂的计算比使用模板或C++预处理器更容易运行,再加上你所有的Python库和扩展.另一方面,如果出现问题,它会使调试变得更难.如果您感兴趣,我可以提供一些示例和Emacs模式来编辑猎豹C++程序.

如果你需要那么强大的东西,并希望只停留C++℃以内,看看升压预处理器,在这里.它需要一些时间来适应它,但是当涉及重复代码时可以使生活变得非常容易

好吧,我正在粘贴猎豹的例子,给我几分钟:

#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
        for(int a = 0; a < $N; ++a) {
            /// for functions in block
%for ii, (fi,fj) in enumerate(fb)
%set i = ii + ifb
/// can also use (ix,iy,iz)=fi[0:2], need to clean up when not lazy
%set ix = fi[0]
%set iy = fi[1]
%set iz = fi[2]
%set jx = fj[0]
%set jy = fj[1]
%set jz = fj[2]
            q$(i) += Ix(a,$(ix),$(jx))*Iy(a,$(iy),$(jy))*Iz(a,$(iz),$(jz));
%end for
            /// end for functions in block
        }
Run Code Online (Sandbox Code Playgroud)

生产(运行后cheetah ...)

#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
        for(int a = 0; a < 6; ++a) {
            q0 += Ix(a,0,1)*Iy(a,0,0)*Iz(a,0,0);
            q1 += Ix(a,1,1)*Iy(a,0,0)*Iz(a,0,0);
            q2 += Ix(a,0,1)*Iy(a,1,0)*Iz(a,0,0);
            q3 += Ix(a,0,1)*Iy(a,0,0)*Iz(a,1,0);
            q4 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,0,0);
            q5 += Ix(a,1,0)*Iy(a,0,1)*Iz(a,0,0);
            q6 += Ix(a,0,0)*Iy(a,1,1)*Iz(a,0,0);
            q7 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,1,0);
            q8 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,0,1);
            q9 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,1);
        }
Run Code Online (Sandbox Code Playgroud)

这是一个常规的C++代码

以%开头的行由cheetah预处理器解释为python语句.///是猎豹评论.默认值使用#作为python语句,但我更改了它们以避免与C预处理程序指令冲突.%end必须用于终止python块.以$开头的C++代码中的变量被python变量替换.

你想要使用boost预处理器的例子吗?


jkp*_*jkp 1

如果您使用 C++,我认为您唯一可行的选择是直接预处理器宏或自定义代码生成

您描述的工作流程基本上相当于某种形式的代码生成,您可以将 .m 文件预处理为可编译的 C++ 代码。 SWIG是执行此操作的一个非常好的项目示例。

就我个人而言,我在用 Python 编写代码生成器方面取得了巨大成功,但我认为任何脚本语言都一样好。可能有用的一个包是我们自己的Ned Batchelder的cog :)