是否有所有 Swift SIMD 浮点类型都符合的协议?
Is there any protocol that all Swift SIMD float types conform to?
大多数 Swift SIMD 浮点类型都有 +-*/ 运算符,所以我们可以像下面这样计算总和:
import simd
float2(2.0) + float2(2.0) // float2(4.0, 4.0)
float4(2.0) + float4(2.0) // float4(4.0, 4.0, 4.0, 4.0)
现在,假设我有一个通用函数,它接受一对 float2、float3 或 float4 作为参数和 returns 它们的总和:
func calculateSum<T: SomeProtocolCoversThoseFloats>(a: T, b: T) -> {
return a + b
}
有没有像这样的协议"SomeProtocolCoversThoseFloats"或者有什么方法可以创建这样的协议?
如果没有(而且似乎没有),添加您自己的也很容易:
protocol SimdFloat {}
extension float2 : SimdFloat {}
extension float3 : SimdFloat {}
extension float4 : SimdFloat {}
这并没有真正直接解决您的问题,但是因为它没有声明两个 SimdFloat 的实现 +.
David 的方向是正确的,这样的协议不存在(simd 来自 C,C 没有协议,这并不奇怪),但您可以自己声明一个。为了使它可以使用 +-*/,你必须将它们添加到协议中:
import simd
protocol ArithmeticType {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
}
extension float4 : ArithmeticType {}
extension float3 : ArithmeticType {}
extension float2 : ArithmeticType {}
func sum<T: ArithmeticType>(a: T, b: T) -> T {
return a + b
}
如果需要,您还可以扩展 Double
、Float
、Int
等
大多数 Swift SIMD 浮点类型都有 +-*/ 运算符,所以我们可以像下面这样计算总和:
import simd
float2(2.0) + float2(2.0) // float2(4.0, 4.0)
float4(2.0) + float4(2.0) // float4(4.0, 4.0, 4.0, 4.0)
现在,假设我有一个通用函数,它接受一对 float2、float3 或 float4 作为参数和 returns 它们的总和:
func calculateSum<T: SomeProtocolCoversThoseFloats>(a: T, b: T) -> {
return a + b
}
有没有像这样的协议"SomeProtocolCoversThoseFloats"或者有什么方法可以创建这样的协议?
如果没有(而且似乎没有),添加您自己的也很容易:
protocol SimdFloat {}
extension float2 : SimdFloat {}
extension float3 : SimdFloat {}
extension float4 : SimdFloat {}
这并没有真正直接解决您的问题,但是因为它没有声明两个 SimdFloat 的实现 +.
David 的方向是正确的,这样的协议不存在(simd 来自 C,C 没有协议,这并不奇怪),但您可以自己声明一个。为了使它可以使用 +-*/,你必须将它们添加到协议中:
import simd
protocol ArithmeticType {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
}
extension float4 : ArithmeticType {}
extension float3 : ArithmeticType {}
extension float2 : ArithmeticType {}
func sum<T: ArithmeticType>(a: T, b: T) -> T {
return a + b
}
如果需要,您还可以扩展 Double
、Float
、Int
等