Store complex and real numbers with same underlying

Does this meet your need?

struct MyData{S, T<:Union{S, Complex{S}}}
  a::S  # Real
  b::T  # Real or Complex
end

data1 = MyData(1.0, 2.0)
data2 = MyData(1.0, 2.0+1.0im)
data3 = MyData(1, 2)
data4 = MyData(1, 2-2im)

dispatch(x::MyData{Float64, Float64}) =
  x == data1
dispatch(x::MyData{Float64, Complex{Float64}}) =
  x == data2

dispatch(x::MyData{Int64, T}) where {T<:Union{Int64, Complex{Int64}}} =
  x == data3 || x == data4
# or the last can be done this way
const  MaybeComplexInt64 =
  Union{Int64, Complex{Int64}}
dispatch(x::MyData{Int64, T}) where {T<:MaybeComplexInt64} =
  x == data3 || x == data4

julia> dispatch(data1)
true
julia> dispatch(data2)
true
julia> dispatch(data3)
true
julia> dispatch(data4)
true
1 Like