I recently frequently encounter the situation where I need to both copy as
well as optionally convert an object. It turns out `convert` on its own
will not do the job in this case as it doesn't create a copy if the
conversion is trivial:
julia> v = Vector{Int}();
julia> convert(Vector{Int}, v) === v
true
julia> convert(Vector{Float64}, v) === v
false
So to be safe I have to write `copy(convert(NewT,obj))`, but that creates
two copies in case `NewT != obj` [1]. I assume this must be a fairly common
problem, and I am surprised Julia doesn't offer a solution to it.
The following is a first attempt at a solution, but I would not be
surprised if there are edge cases where this approach fails.
function copyconvert{T}(::Type{T}, x)
y = convert(T,x)
if y === x
return copy(x)
else
return y
end
end
[1] In C++, the compiler would optimise this case down to one copy ("copy
elision"), but I assume the Julia compiler doesn't. Correct?