2015-11-05 53 views
0

大多数雨燕SIMD浮点类型有+ - * /运营商,所以我们就可以计算器像下面的总和: 是否有任何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变量作为参数,并返回它们的总和:

func calculateSum<T: SomeProtocolCoversThoseFloats>(a: T, b: T) -> { 
    return a + b 
} 

是否有任何协议,其功能类似这样的“SomeProtocolCoversThoseFloats”或者是没有办法,我可以创建这样一个协议的任何方式?

+0

同样的技术在http://stackoverflow.com/questions/25575513/what-protocol-should-be-adopted-by-a-type-for-a-generic-function-to-take-any-num可以在这里应用。 –

+0

啊,这是一个很酷的东西,正是我想要做的!十分感谢大家。 :) – hagmas

回答

2

大卫走的是正确的方向,这样的协议不存在(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 
} 

您还可以扩展DoubleFloatInt等,如果需要

1

如果没有(有没有出现如此),它很容易添加自己:

protocol SimdFloat {} 

extension float2 : SimdFloat {} 
extension float3 : SimdFloat {} 
extension float4 : SimdFloat {} 

这并没有真正直接解决您的问题,但是因为它不” t声明两个SimdFloat的工具+。

+0

您必须将'func +(lhs:Self,rhs:Self) - > Self'等添加到协议定义中。 –

+0

是的,我只是在尝试,我不确定是否可以将运营商添加到协议中。在我可以更新答案之前......堆栈溢出忘了我是谁......在这一点上,最简单的就是迟到Kame的答案去:) –

相关问题