在面向数值的语言(Matlab、Fortran)中,范围运算符和语义在处理多维数据时非常方便。
例如:
A(i:j,k,:n) // represents two-dimensional slice B(i:j,0:n) of A at index k
不幸的是,C++ 没有范围运算符 (:)。当然可以使用 range/slice 函子来模拟,但语义不如 Matlab 清晰。我正在 C++ 中对矩阵/张量域语言进行原型设计,并且想知道是否有任何选项可以重现范围运算符。
我仍然想完全依赖 C++/prprocessor 框架。
到目前为止,我已经浏览过升压波,这可能是一个合适的选择。
还有其他方法可以向 C++ DSL 引入新的非本地运算符吗?
我知道您无法添加新的运算符。我正在专门寻找解决方法。
我想到了一件事(非常丑陋的黑客,我不打算使用):
#define A(r) A[range(((1)?r), ((0)?r))] // assume A overloads []
A(i:j); // abuse ternary operator
我之前使用过的解决方案是编写一个外部预处理器来解析源代码并用普通 C++ 替换自定义运算符的任何使用。为了您的目的,a : b
使用将被替换为类似的东西a.operator_range_(b)
, and operator:()
带有声明的声明range_ operator_range_()
。然后在 makefile 中添加一条规则,在编译源文件之前对其进行预处理。这可以在 Perl 中相对轻松地完成。
但是,由于过去使用过类似的解决方案,我不推荐它。如果您不对源代码的处理和生成方式保持警惕,则可能会造成可维护性和可移植性问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)