我写一些简单的向量和矩阵类。他们是这样的:

// Vector with Floats
case class Vector3f(x: Float, y: Float, z: Float) {
  def +(v: Vector3f) = Vector3f(x + v.x, y + v.y, z + v.z)
}

// Vector with Doubles
case class Vector3d(x: Double, y: Double, z: Double) {
  def +(v: Vector3d) = Vector3d(x + v.x, y + v.y, z + v.z)
}

如果我去与其他方法和类,如Point3f / d,Vector4f / d,Matrix3f / d,Matrix4f / d ...这将是大量的工作。 UFF ... 因此,我认为仿制药可以在这里尽可能的帮助和删除冗余从我的代码库。我认为是这样的:

// first I define a generic Vector class
case class Vector3[@specialized(Float, Double) T](x: T, y: T, z: T) {
   def +(v: Vector3[T]) = new Vector3[T](x + v.x, y + v.y, z + v.z)
}

// than I use some type aliases to hide the generic nature
type Vector3f = Vector3[Float]
type Vector3d = Vector3[Double]

的想法是,阶编译器生成专门类的Vector3 [浮点]和的Vector3 [双]为C ++模板会做类似。不幸的是我不得不把一些类型的约束的类型参数的[T]类的Vector3这样+上T.我的问题定义操作:我如何写的Vector3 [浮点],它具有相同的性能特点Vector3f? 语境:我想用在碰撞检测代码Vector3f /的Vector3D类...所以表现为我做事情

有帮助吗?

解决方案

使用结合分数的上下文:

case class Vector3[@specialized(Float, Double) T : Fractional](x: T, y: T, z: T)  { ...

,则类的主体内,得到的算术运算符的一个实例:

  val fractOps = implicitly[Fractional[T]]

最后成员导入类的范围:

  import fractOps._

此后则可以在类中使用的类型T的值写入普通缀操作。可悲的是,你将不得不使用fractOps.div(a, b)而不是a / b为师。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top