Ok, I found a solution. Seems **converter** is selected based on the type of the result. So I can define it like this: converter toPointInt*[T](pt: Point[T]): Point[int] = result.x = int(pt.x) result.y = int(pt.y) converter toPointFloat*[T](pt: Point[T]): Point[float] = result.x = float(pt.x) result.y = float(pt.y) Run
And then just call c = b Run <https://play.nim-lang.org/#ix=3IJX> Maybe it's not good practice, but useful to hide the details in certain situations and to avoid clutter.