Although this appears to be an interesting corner case (at least to me), in your production code you should probably stop doing stuff like
S = Vector{Symmetric{RT}}(undef, T)
for performance reasons. Note that something like Vector{Symmetric{Float64}}
is not a concrete type (it’s a UnionAll
); Symmetric
has a second type parameter. As a result, you’re incurring a performance cost due to dynamic dispatch any time you touch S
. Additionally, your function only accepts stuff like Vector{Symmetric{Float64}}(undef, 1)
(a Vector
with non-concrete element type), not e.g. [Symmetric(rand(3, 3))]
(which does have concrete element type). So you’re inconveniencing callers of the function by forcing them to use a suboptimal storage type, which can be fixed by doing what @Raf proposed in Cannot use parametric type within function body - #2 by Raf. Once that’s done, you could just use S = similar(C, T)
to simultaneously clean up the code and fix the non-concrete element type issue for S
.