HATEBIN
>
proc fieldCount(val: object or tuple): int = for field in val.fields: inc result proc fieldCount(typ: typedesc[object or tuple]): int = fieldCount(default typ) proc hasExactlyNFields(obj: typedesc[object or tuple], N: static int): bool = fieldCount(default(obj)) == N type Fields[T: static int] {.explain.} = concept type Fielder hasExactlyNFields(Fielder, T) template doThing(obj: tuple or object) = const required = fieldCount(typeof locals()) proc internalDoThing(fields: Fields[required]) = echo fields internalDoThing(obj) proc myThingy() = var i = 100 doThing (300,) var j = 300 doThing (400, 500) var k = 400 doThing (100, "hmmmm", 3.14159265358979) myThingy()