我正在尝试查看是否可以在 Java 中模仿模板表达式模式,以进行循环融合等优化。
例如,我将此表达式模板示例中的 c++ 类移植到 java 类:https ://en.wikipedia.org/wiki/Expression_templates#Motivation_and_example
VecExpression<E>
首先,一个表示向量表达式的模板类。它使用模板参数E
并将类类型E
作为构造函数参数。然后它创建一个私有变量thisAsE
集以this
转换为E
public abstract class VecExpression <E> {
private VecExpression thisAsE;
public VecExpression(Class<E> type) throws Exception {
if(type.isInstance(this)) {
thisAsE = (VecExpression)type.cast(this);
}
else {
throw new Exception("Class type must extend VecExpression");
}
}
public double get(int i) {
return thisAsE.get(i);
}
public int size() {
return thisAsE.size();
}
}
其次,一个类Vec
扩展VecExpression<Vec>
,它传递Vec.class
给超级构造函数并实现类中调用的get()
和方法。size()
VecExpression<E>
public class Vec extends VecExpression<Vec> {
private double[] elems;
public <E> Vec(VecExpression<E> expression) throws Exception {
super(Vec.class);
for(int i = 0; i < expression.size(); ++i) {
elems[i] = expression.get(i);
}
}
public Vec(double[] elems) throws Exception {
super(Vec.class);
this.elems = elems;
}
public double get(int i) {
return elems[i];
}
}
VecSum<E1, E2>
第三,扩展的模板类VecExpression<VecSum<E1, E2>
,并使用其get()
方法返回两个VecExpression<E>
s 的和。类型作为显式参数传递Class<VecSum<E1, E2>> type
。
public class VecSum <E1, E2> extends VecExpression<VecSum<E1, E2>> {
private VecExpression u;
private VecExpression v;
public VecSum(Class<VecSum<E1, E2>> type, VecExpression<E1> u, VecExpression<E2> v) throws Exception {
super(type);
if(u.size() != v.size()) {
throw new Exception("Vectors must be of the same size");
}
this.u = u;
this.v = v;
}
public double get(int i) {
return u.get(i) + v.get(i);
}
public int size() {
return v.size();
}
}
最后,我们使用表达式模板生成一个类,该类可以一次通过内存添加三个向量。
public class Main {
public static void main(String[] args) throws Exception {
Vec a = new Vec(new double[] {1, 2, 3});
Vec b = new Vec(new double[] {1, 2, 3});
Vec c = new Vec(new double[] {1, 2, 3});
VecSum<Vec, Vec> ab = new VecSum<Vec, Vec>(VecSum<Vec, Vec>.class, a, b);
VecSum<VecSum<Vec, Vec>, Vec> abc = new VecSum<>(VecSum<VecSum<Vec, Vec>, Vec>.class, ab, c);
}
}
根据 Louis Wasserman 的评论编辑
但是,传递给VecSum
构造函数的类类型不起作用,因为表达式试图从参数化类型中获取类。Louis 指出,泛型类的实现不会像在 c++ 中那样编译成不同的类。您将如何传递它们的类型,或者是否有另一种表达模板模式的方法?