Как сделать конструкторы, которые создают значения по умолчанию для параметрически типизированных полей

Для типа с параметрически типизированными полями, такими как:

struct Point{T <: AbstractFloat}
    x::T
    y::T
end

Как создать внешний конструктор, который создает значения по умолчанию с нужными типами? Например, я хочу, чтобы Point() не принимал аргументов, чтобы создать Point{T}(0.0, 0.0), где я все еще могу указать T как Float64 или каким-то другим образом.


person BaliSun    schedule 12.03.2021    source источник


Ответы (2)


Это делает то, что вы хотите?

julia> struct Point{T <: AbstractFloat}
           x::T
           y::T
       end

julia> Point{T}() where T = Point{T}(zero(T), zero(T))

julia> Point{Float64}()
Point{Float64}(0.0, 0.0)

julia> Point{Float32}()
Point{Float32}(0.0f0, 0.0f0)

julia> Point{Float16}()
Point{Float16}(Float16(0.0), Float16(0.0))
person pfitzseb    schedule 12.03.2021

Если вы не возражаете против добавления дополнительной зависимости, пакет Parameters.jl предоставляет макрос @with_kw, позволяющий указать значения по умолчанию следующим образом:

using Parameters
@with_kw struct Point{T <: AbstractFloat}
  x::T = 0.0
  y::T = 0.0
end

julia> Point()
Point{Float64}
  x: Float64 0.0
  y: Float64 0.0

julia> Point{Float32}() 
Point{Float32}
  x: Float32 0.0f0
  y: Float32 0.0f0
person mapi1    schedule 12.03.2021