表达式 '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 类型。
假设我只想要一个模板到 "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)
编辑:阅读 = 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 类型。