---
title: "Draft RFC: Derive SmartPointer"
tags: ["T-lang"]
date: 2024-03-07
url: https://hackmd.io/IhchhYGgTGS43BoLe8xvxA
---
# Summary
In this RFC, we add a new `derive(SmartPointer)` macro to the standard library. This macro can be applied to a type definition, causing that type to implement the unstable traits [`DispatchFromDyn`] and [`Receiver`]. This allows the smart pointer type to be used as the `self` type in method definitions. These methods can be called with either static or dynamic dispatch.
TODO: Are we just implementing `DispatchFromDyn` or also `Receiver` here?
[`DispatchFromDyn`]: https://doc.rust-lang.org/core/ops/trait.DispatchFromDyn.html
[`Receiver`]: https://github.com/adetaylor/rfcs/blob/arbitrary-self-types-v2/text/3519-arbitrary-self-types-v2.md
# Background / Motivation
TODO
# Mechanics
Using this macro would look like this:
```rust
#[derive(SmartPointer)]
struct Foo<#[pointee] T> {
ptr: *const T,
}
```
Or, equivalently:
```rust
#[derive(SmartPointer)]
struct Foo<T>
where
#[pointee] T:,
{
ptr: *const T,
}
```
This would expand into something along the lines of:
```rust
struct Foo<T> {
ptr: *const T,
}
// These impls can *only* be written on stable using this macro.
impl<T> DyspatchFromDyn for Foo<T> {}
// TODO: Are we also implementing `Receiver`?
impl<T> Receiver for Foo<T> {
type Target = T;
}
```
The macro would enforce these constraints on the type to which it is applied:
- TODO