scala - 在宏扩展时生成函数

标签 scala macros metaprogramming implicit dotty

我想为接受 1 类型参数的类生成函数

case class C[T] (t: T)

取决于 T类型参数。

我想生成的函数是由 T 上可用的函数派生的。 .

我真正想要的是使 T 的所有功能都可用。 , 也可用于 C .

C[Int] 为例, 我希望能够调用 C Int 上可用的任何功能并将函数调用发送到 Int包含在 C .
val c1 = new C(1)
assert(c1 + 1 == 2)

如何通过使用 Scala 2 或 dotty 宏来实现这一点?
或者,这可以通过其他方式实现吗?

最佳答案

使用 implicit conversions 可以轻松实现您想要做的事情,所以你真的不需要宏:

case class C[T] (t: T)

object C { //we define implicit conversion in companion object
  implicit def conversion[T](c: C[T]): T = c.t
}

import scala.language.implicitConversions
import C._

val c1 = C(1)
assert(c1 + 1 == 2) //ok

val c2 = C(false)
assert(!c2 && true) //ok


使用 隐式转换 意味着,只要编译器注意到类型不匹配,它就会尝试应用隐式函数隐式转换值。

关于scala - 在宏扩展时生成函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56914218/

相关文章:

c++ - Scala等与C/C++/Fortran的性能比较?

macros - 评估宏体内传递的参数

c++ - 为什么这个用于检测类型 T 是否具有 void operator(EDT const&) 的 C++ 特性会失败?

automation - Petri网绘图和代码生成

scala - 如何 "contramap"akka-streams 接收器

scala - Scala 中具有依赖类型的参数的模式匹配的类型安全性

scala - 在 Spark 中,如何读取用 bucketBy 写入的 parquet 文件,并保存分桶数据?

c++ - 将模板参数传递给 MSVC 中的宏

Qt - Q_OBJECT 和宏

c++ - 我可以从类型列表中声明模板特化吗?