If performance matters, currently you're going to have to specify the element 
type---not for the sake of your `MyType` object, but simply for the efficient 
access to elements of c and d. This will change once 
https://github.com/JuliaLang/julia/pull/15921 merges. On julia 0.4, you could 
write your own version of a function that looks like the definition of `vect` 
in that PR.

In cases where c and d have different element types, you can write a variant of

foo{T}(x::T, y::T) = T
foo(x, y) = foo(promote(x, y)...)

It will be a little more complicated because you'll have to call `convert` 
explicitly rather than just using promote, but hopefully you get the idea.

Best,
--Tim


On Monday, April 18, 2016 01:20:36 AM Patrick Kofod Mogensen wrote:
> Say I have something like
> 
> type MyType{T}
>     a::T
>     b::Vector{T}
>     c::Vector{Vector{T}}
>     d::Vector{Matrix{T}}
> end
> 
> MyType(3, [3, 3], Vector{Int64}[[3,3], [4,4]], Matrix{Int64}[[3 1],[1 3]])
> 
> MyType(3, [3, 3], Vector[[3,3], [4,4]], Matrix[[3 1],[1 3]])
> 
> 
> The first call to the MyType constuctor will work, but the second one will
> not, because the Vector[...] and Matrix[...]'s are not told that they are
> only going to contain arrays of integers.
> 
> Say I want to provide users with a type such as MyType, but I don't want
> them to write {Float64} or {Int64} all the time. What is the best way to
> allow the second call to MyType?
> 
> Patrick

Reply via email to