This crate provides a procedural macro, specialized_dispatch, a convenient
way to implement different behaviors based on type of an expression.
This works by creating different specializations in the callsite by making use
of min_specialization nightly feature under the hood.
As such, the caller needs to enable this nightly feature for the library from which this macro is called.
Simple Example
use specialized_dispatch;
example function roughly expands to below code. Note that exact expansion is internal
implementation detail. This example is provided to demonstrate how it works under the
hood.
The example above is included in the repository.
It can be run with cargo run --example simple_example.
Expanded code can be inspected using cargo-expand: cargo expand --example simple_example.
Trait Bounds
Trait bounds can be provided for the default case:
use Display;
use specialized_dispatch;
// The argument type must also bind to the same trait.
Likewise, the example above is included in the repository.
It can be run with cargo run --example trait_bound or inspected with
cargo-expand.
Limitations
Requires nightly
This is due to relying on min_specialization feature.
Only concrete types are supported for specialization
Specialization can be used only with concrete types (e.g. subtraits cannot be
used for specialization). This is an existing limitation inherited from the
current implementation of min_specialization feature.
No variables other than the argument can be referred
The macro expands its arms to some method implementations. As such, it cannot refer to other variables in the scope where it's called from.