是否可以在编译时使用宏来测试是否存在一些隐含的当前类型?
类似这样的事情
def packOne(tpe:c.universe.Type,....) = {
if(tpe =:= ByteTpe ) makeast1
else if (tpe =:= LongTpe ) makeast2
else if (tpe =:= c.typeOf[java.lang.String]) makeast3
....
else exists implicit convention for TPE {
q"""
// call some function with implicit PACK[T]
implicitly[Packer[$tpe]].pack(...)
"""
} else {
// Make default conversion
}
}
答案 0 :(得分:2)
应该可以使用inferImplicitValue
:
val t = c.internal.typeRef(NoPrefix, typeOf[Packer[_]].typeSymbol, List(tpe))
c.inferImplicitValue(t) match {
case EmptyTree => … // default conversion
case packer => q"packer.pack(…)"
}