Restricting method dispatch to a few concrete types


I have a method :

function f(x)
    return x

for which i have a faster version that works only if x is either of type T1 or of type T2. I tried writting:

function f(x::T) where {Union{T1,T2} <: T <: Union{T1,T2}}

but it did not work.

How can i specify that the Type must be either T1 or T2 ? (it cannot be any subtypes of T1 and T2, which are already concretes types).

The specific usecase is T1,T2 = Float32,Float64, for wich the function directly calls into lapack.

You just want where T <: Union{T1,T2}. Concrete types can’t have subclasses.

Aaand you are right. Thanks

Or just

function f(x::Union{T1,T2}) 
    # stuff

Yep but does not work in my case since many parameters use the T parametric type, and I want it to be the same for everyone.

Just to note that :

function f(x::Union{T1,T2}, y::Union{T1,T2}) where {T1,T2}
is not the same as
function f(x::T, y::T) where {T<:Union{T1,T2}}.

In the first case x and y might not be the same type, and in the second they are guarenteed to be the same type.

Yes. It just wasn’t necessary in your particular example, so I wanted to point it out.

1 Like