Borrado de tipos en C++26 con reflexión: la librería duck lo simplifica

Fuentes: Beautiful Type Erasure with C++26 Reflection

La librería rjk::duck, publicada como un único header, aprovecha las anotaciones y la metaprogramación por reflexión introducidas en C++26 para implementar borrado de tipos sin la verbosidad habitual. En lugar de escribir a mano cientos de líneas de código propensas a errores —o recurrir a alternativas pesadas como Boost.TypeErasure o Folly.Poly—, el programador declara una vez la interfaz mediante un struct anotado con [[=rjk::trait]] y el sistema genera internamente las etiquetas, el vtable y los punteros a función necesarios para envolver cualquier tipo que cumpla ese contrato.

El artículo explica paso a paso las técnicas de metaprogramación que hacen posible esta biblioteca. Primero muestra cómo C++26 permite reflejar tipos y variables con el operador ^^ y consultarlos con funciones como annotations_of, type_of o members_of. A partir de ahí, duck transforma los miembros del trait en etiquetas has_fn internas combinando fixed_string y substitute. Después, dentro de un bloque consteval —el único contexto donde hoy se permite generar código—, un template for recorre los traits y, mediante define_aggregate, construye dinámicamente un struct vtable cuyas ranuras son punteros a función con la signatura adecuada. Una segunda función consteval crea, para cada tipo concreto T, una instancia estática de ese vtable resolviendo qué miembro de T corresponde a cada ranura y asignándolo con el operador splice ([: expr :]).

El resultado es un contenedor rjk::duck que admite semánticas propias y no propias, operadores, composición de interfaces, adaptadores y métodos de extensión. El proyecto se distribuye en GitHub y por ahora solo es compatible con GCC compilado con -std=c++26 -freflection.