1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
discard """
targets: "cpp"
output: '''
int
float'''
disabled: "windows" # pending bug #18011
"""
import typetraits
# bug #4625
type
Vector[T] {.importcpp: "std::vector<'0 >", header: "vector".} = object
proc initVector[T](): Vector[T] {.importcpp: "'0(@)", header: "vector", constructor.}
proc doSomething[T](v: var Vector[T]) =
echo T.name
var v = initVector[int]()
v.doSomething()
var vf = initVector[float]()
vf.doSomething() # Nim uses doSomething[int] here in C++
# Alternative definition:
# https://github.com/nim-lang/Nim/issues/7653
type VectorAlt*[T] {.importcpp: "std::vector", header: "<vector>", nodecl.} = object
proc mkVector*[T]: VectorAlt[T] {.importcpp: "std::vector<'*0>()", header: "<vector>", constructor, nodecl.}
proc foo(): VectorAlt[cint] =
mkVector[cint]()
proc bar(): VectorAlt[cstring] =
mkVector[cstring]()
var x = foo()
var y = bar()
proc init[T; Self: Vector[T]](_: typedesc[Self], n: csize_t): Vector[T]
{.importcpp: "std::vector<'*0>(@)", header: "<vector>", constructor, nodecl.}
proc size[T](x: Vector[T]): csize_t
{.importcpp: "#.size()", header: "<vector>", nodecl.}
var z = Vector[int16].init(32)
assert z.size == 32
|