Hi.
I have the following problem/question. I have a struct
struct foo{T<:Integer, U<:Real} <: AbstractGraph{T}
bar1::T
bar2::U
end
Now, I want to create an instance of foo, where I explicitly define the type U
but infer the type T
from the arguments. I tried
function foo{U}(...) where {U<:Real}
# do some stuff here and get T
foo{T,U}(bar1, bar2)
end
But this errored with asking for T
. Now, what is the right way to construct foo
with only passing U
as a type?
EDIT1: See the marked answer and have a look at this thread as well: https://discourse.julialang.org/t/how-to-correctly-define-and-call-templated-parametric-methods-using-the-new-where-syntax
Something like that?
function foo(::Type{U}, bar2) where {U<:Real}
# do some stuff here and get T
T = typeof(bar2)
bar1 = zero(U)
foo{T,U}(bar1, bar2)
end
3 Likes
Hi @Henrique_Becker,
thanks, that was what I was looking for!
1 Like
I noticed just now that this is basically the first doubt I asked in Discourse.
So the inquirer is now the replier. The cycle begins anew.
5 Likes
Very good! Reading through your linked thread leaves me with another question. What is the difference between below definitions of foo
foo(::Type{U}) where {U<:Real}
and
foo(U::Type)
besides that U
can by any type in the second example und only a subtype of real in the first?
1 Like
There is no difference. Actually, if you define foo at the REPL, you will see that after the second definition, there is still only one method!
julia> foo(::Type{U}) where U = 1
foo (generic function with 1 method)
julia> foo(U::Type) = 100
foo (generic function with 1 method)
2 Likes
That’s interesting. So, why are there two different syntax’?
1 Like
As in your example, writing Type{T} where T
gains you access to the type parameter either for dispatch purposes (T <: Real
) or to use later inside your function.
that makes sense! Great, thanks!
1 Like