如何在Nim的template中使用varargs?代码无法编译问题求助
问题解答
Nim的template支持varargs参数,你给出的示例编译失败和varargs本身无关,核心原因是:
普通for循环属于运行时逻辑,循环变量m是运行时值,而from m import nil要求m必须是编译期可确定的模块标识符,两者不匹配。你写的多参数重载模板能正常运行,就是因为每个参数都是编译期明确的标识符。
可行的实现写法
兼容所有版本的递归写法
用递归模板处理可变参数,所有逻辑都在编译期展开,完全符合要求:
template require*() = discard template require*(m: untyped, rest: varargs[untyped]) = from m import nil require(rest) # 调用测试 require options, strutils
Nim 2.0+ 简化写法
如果你使用的是Nim 2.0及以上版本,也可以用静态for循环直接遍历varargs参数,static修饰的循环会在编译期展开,循环变量m在展开阶段就是确定的标识符:
template require*(modules: varargs[untyped]) = for m in static(modules): from m import nil # 调用测试 require options, strutils
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

