在面向数字的语言(Matlab、Fortran)中,范围运算符和语义在处理多维数据时非常方便。 例如:
A(i:j,k,:n) // represents two-dimensional slice B(i:j,0:n) of A at index k
不幸的是,C++ 没有范围运算符 (:)。当然它可以使用范围/切片仿函数来模拟,但语义不如 Matlab 干净。我正在用 C++ 制作矩阵/张量域语言的原型(prototype),想知道是否有任何选项可以重现范围运算符。 我仍然想完全依赖 C++/prprocessor 框架。
到目前为止,我已经研究过 boost wave,这可能是一个合适的选择。
是否有任何其他方法可以将新的非 native 运算符引入 C++ DSL?
我知道您无法添加新的运算符。我正在专门寻找解决方法。 我想出了一件事(非常丑陋的 hack,我不打算使用):
#define A(r) A[range(((1)?r), ((0)?r))] // assume A overloads []
A(i:j); // abuse ternary operator
最佳答案
我之前使用的一个解决方案是编写一个外部预处理器来解析源代码并用普通 C++ 替换自定义运算符的任何使用。出于您的目的,a : b
uses 将替换为类似 a.operator_range_(b)
的内容,以及带有声明的 operator:()
声明range_ operator_range_()
。然后在您的 makefile 中添加一条规则,在编译源文件之前对其进行预处理。这可以在 Perl 中相对轻松地完成。
但是,我过去使用过类似的解决方案,因此不推荐它。如果您不对源代码的处理和生成方式保持警惕,它可能会产生可维护性和可移植性问题。
关于C++ 域特定的嵌入式语言运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618753/