【发布时间】:2016-07-24 09:09:03
【问题描述】:
考虑:
val a:ExpressionT[Int] = Const(1)
val b:ExpressionT[Float] = Const(2.0f)
// + must raise types:
// (i+i) -> i
// (i+f) -> f
// (f+i) -> f
// (f+f) -> f
val c:ExpressionT[Float] = a+b
地点:
// A typed Expression
trait ExpressionT[T] extends Expression{
def evaluate(): T
}
class Const[T<:Any](value:T) extends ExpressionT[T] {
def evaluate(): T = value
}
object Const {
def apply(value:Int) = new Const[Int](value)
def apply(value:Float) = new Const[Float](value)
}
实现适用于所有数字类型的 + 运算符的最优雅方法是什么?有没有办法避免枚举所有类型的组合?
在 C++ 中,我们可以简单地(从内存中):
template <typename T>
class ExpressionT {
typedef typename T EvalT;
virtual T evaluate() const = 0;
}
// HighestType<X,Y>::EvalT,
// (int,float) --> float
// (float,int) --> float
// (int,int) --> int
template <typename X, typename Y>
class Add : public ExpressionT< HighestType<X::EvalT, Y::EvalT>::EvalT > {
Add(Expression<X> const& l, Expression<X> const& r) {...}
inline ResultT evaluate() { return l+r; }
}
template <typename X, typename Y>
auto operator + ( Expression<T> const& lhs,
Expression<T> const& rhs ){
return Add(lhs, rhs);
}
... 不需要每个类型的情况,如果未定义 +(lhs,rhs) 也将很高兴无法编译,并且还直接允许扩展新的不可见类型 +(int, Matrix), +(Matrix , float),无需任何额外工作。
【问题讨论】: