测试隐式是否存在

时间:2016-08-08 09:57:36

标签: scala macros

是否可以在编译时使用宏来测试是否存在一些隐含的当前类型?

类似这样的事情

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
  }

 }

1 个答案:

答案 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(…)"
}