表达式 'T' 属于 'type int' 类型,必须丢弃

expression 'T' is of type 'type int' and has to be discarded

假设我只想要一个模板到 "generate" 类型,从通用参数,并在需要类型的地方使用模板的调用:

template p[T] = T
var a: p[int]()

(3, 14) Error: expression 'T' is of type 'type int' and has to be discarded

哈哈,真的吗?
我希望我只是个新手,确实有办法(希望没有人为的)做到这一点。

请注意,它是相同的输出,只是进行了非通用尝试:

template p(t: typedesc) = t
var a: p(int)

编辑:阅读 ,我意识到如果我们指定模板的 return 类型,系统可能会感觉更受欢迎;在 = t 之前添加 : untyped 来构建之前的代码片段。有什么解释吗?

template p[T] = T
var a: p[int]()

这等同于:

template p[T]: void = T
var a: p[int]()

你告诉编译器你的模板return什么都没有,这就是它抱怨的原因。

因此您需要指定 return 类型...

template p[T]: typedesc = T
var a: p[int]()

然后它工作正常。此行为扩展到 Nim 中的过程和方法,未指定 return 类型意味着没有 return 值。

Compile-time 在 Nim 中从类型映射到类型的函数通常用 typedesc parameters 实现。与泛型参数相比,这具有额外的好处,允许提供以不同方式处理不同类型的多个重载:

type
  Foo = object

# handler all integer types:
template myTypeMapping(T: typedesc[SomeInteger]): typedesc = string 

# specific handling of the Foo type:
template myTypeMapping(T: typedesc[Foo]): typedesc = seq[string]

# all sequence types are not re-mapped:
template myTypeMapping(T: typedesc[seq]): typedesc = T

请注意,您始终需要指定您的模板具有 typedesc return 类型。