View source code
Display the source code in std/typecons.d from which thispage was generated on github.
Report a bug
If you spot a problem with this page, click here to create aBugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.Requires a signed-in GitHub account. This works well for small changes.If you'd like to make larger changes you may want to consider usinglocal clone.
Template std.typecons.unwrap
Supports structural based typesafe conversion.
template unwrap(Target);
If Source
has structural conformance with the interface
Targets
,
wrap creates an internal wrapper class which inherits Targets
and
wraps the src
object, then returns it.
unwrap
can be used to extract objects which have been wrapped by wrap
.
Template unwrap
Contained Functions
Name | Description |
---|---|
unwrap | |
unwrap |
Alias unwrap
Example
interface Quack
{
int quack();
@property int height();
}
interface Flyer
{
@property int height();
}
class Duck : Quack
{
int quack() { return 1; }
@property int height() { return 10; }
}
class Human
{
int quack() { return 2; }
@property int height() { return 20; }
}
Duck d1 = new Duck();
Human h1 = new Human();
interface Refleshable
{
int reflesh();
}
// does not have structural conformance
static assert(!__traits(compiles, d1 .wrap!Refleshable));
static assert(!__traits(compiles, h1 .wrap!Refleshable));
// strict upcast
Quack qd = d1 .wrap!Quack;
assert(qd is d1);
assert(qd .quack() == 1); // calls Duck.quack
// strict downcast
Duck d2 = qd .unwrap!Duck;
assert(d2 is d1);
// structural upcast
Quack qh = h1 .wrap!Quack;
assert(qh .quack() == 2); // calls Human.quack
// structural downcast
Human h2 = qh .unwrap!Human;
assert(h2 is h1);
// structural upcast (two steps)
Quack qx = h1 .wrap!Quack; // Human -> Quack
Flyer fx = qx .wrap!Flyer; // Quack -> Flyer
assert(fx .height == 20); // calls Human.height
// structural downcast (two steps)
Quack qy = fx .unwrap!Quack; // Flyer -> Quack
Human hy = qy .unwrap!Human; // Quack -> Human
assert(hy is h1);
// structural downcast (one step)
Human hz = fx .unwrap!Human; // Flyer -> Human
assert(hz is h1);
Example
import std .traits : FunctionAttribute, functionAttributes;
interface A { int run(); }
interface B { int stop(); @property int status(); }
class X
{
int run() { return 1; }
int stop() { return 2; }
@property int status() { return 3; }
}
auto x = new X();
auto ab = x .wrap!(A, B);
A a = ab;
B b = ab;
writeln(a .run()); // 1
writeln(b .stop()); // 2
writeln(b .status); // 3
static assert(functionAttributes!(typeof(ab) .status) & FunctionAttribute .property);
Authors
Andrei Alexandrescu, Bartosz Milewski, Don Clugston, Shin Fujishiro, Kenji Hara
License
Copyright © 1999-2025 by the D Language Foundation | Page generated by ddox.