I don't know this is the best way to make `iterator mitems*[T](a: var
Vector[T]):var T` works, but this code works. It looks like nim just replace
calling `proc `[]`*[T](this:var Vector[T]; index: int): var T` to `v[i]`.
`std::vector[T]::operator[ ](size_type pos)` returns reference to a element.
But a iterator returns `var T` is mapped to pointer to T in C++ code. `(addr
a[i])[]` returns `var T` in Nim and become `&(v[i])` in C++ code.
{.emit: """
using namespace std;
""".}
type
Vector* {.importcpp: "std::vector", header: "<vector>".}[T] = object
proc constructVector*[T](size: cuint): Vector[T] {.
importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
proc constructVector*[T](size: cuint; data:var T): Vector[T] {.
importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
proc constructVector*[T](vector: Vector[T]): Vector[T] {.
importcpp: "vector<'*0>(@)", header: "<vector>", constructor.}
proc destroyVector*[T](this: var Vector[T]) {.importcpp: "#.~Vector()",
header: "<vector>".}
proc `[]`*[T](this:var Vector[T]; index: int): var T {.importcpp: "#[@]",
header: "<vector>".}
proc size*[T](this: var Vector[T]): var int {.importcpp: "size", header:
"<vector>".}
iterator mitems*[T](a: var Vector[T]):var T =
for i in 0..<a.size:
yield (addr a[i])[]
# yield a[i]
type
testObj = object
x: int
y: float
proc main =
var t = testObj(x: 7, y: 7)
var v:Vector[testObj] = constructVector[testObj](2, t)
echo v[0]
for i in v.mitems:
i.x = 123
for i in v.mitems:
echo i.x
main()
Run