Я полагаю, что подобное делается в бесформенных линзах.
Здесь вы можете видеть, что динамика делегирует создание объектива неявному - возвращаемый тип берется из функциональных зависимостей (здесь: тот mkLens.Out
)
trait Lens[S, A] extends LPLens[S, A] { outer =>
...
def selectDynamic(k: String)
(implicit mkLens: MkSelectDynamicOptic[Lens[S, A], A, Symbol @@ k.type, Nothing]): mkLens.Out = mkLens(this)
...
}
Сам Lens генерируется не с помощью макроса, а с обычным выводом, но вы можете использовать макрос для генерации неявного, это должно быть возможно.
object Generic1 extends Generic10 {
...
implicit def mkGeneric10[T[_], U[_], FR[_[_], _[_]]]: Generic1[T, ({ type λ[t[_]] = FR[t, U] })#λ] =
macro Generic1Macros.mkGeneric1Impl[T, ({ type λ[t[_]] = FR[t, U] })#λ]
...
}
Комбинация макро + динамика используется в HList .
object HList extends Dynamic {
...
/**
* Allows to specify an `HList` type with a syntax similar to `Record` and `Union`, as follows,
*
* {{{
* type ISB = HList.`Int, String, Boolean`.T
* }}}
*
* Literal types are allowed, so that the following is valid,
*
* {{{
* type ABC = HList.`'a, 'b, 'c`.T
* type TwoTrueStr = HList.`2, true, "str"`.T
* }}}
*/
def selectDynamic(tpeSelector: String): Any = macro LabelledMacros.hlistTypeImpl
...
}
В общем, вы должны быть в состоянии достичь своей цели. Все зависит только от того, как именно вы хотите создать экземпляр своего объекта - например, Возьмите неявный ClassTag
и вызовите конструктор, используя отражение или, возможно, построив HList
и используя Generic
, чтобы превратить его в конкретное представление или, может быть, что-то еще.