View source code
Display the source code in std/experimental/typecons.d from which this
page was generated on github.
Report a bug
If you spot a problem with this page, click here to create a
Bugzilla 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 using
local clone.
std.experimental.typecons.unwrap
- multiple declarations
Function unwrap
Extract object previously wrapped by wrap
.
inout(Target) unwrap(Target, Source)
(
inout Source src
);
Parameters
Name | Description |
---|---|
Target | type of wrapped object |
src | wrapper object returned by wrap |
Returns
the wrapped object, or null if src is not a wrapper created
by wrap
and Target is a class
Throws
ConvException
when attempting to extract a
struct which is not the wrapped type
See also
Function unwrap
Extract object previously wrapped by wrap
.
inout(Target) unwrap(Target, Source)
(
inout Source src
);
Parameters
Name | Description |
---|---|
Target | type of wrapped object |
src | wrapper object returned by wrap |
Returns
the wrapped object, or null if src is not a wrapper created
by wrap
and Target is a class
Throws
ConvException
when attempting to extract a
struct which is not the wrapped type
See also
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; }
}
struct HumanStructure
{
int quack() { return 3; }
@property int height() { return 30; }
}
Duck d1 = new Duck();
Human h1 = new Human();
HumanStructure hs1;
interface Refreshable
{
int refresh();
}
// does not have structural conformance
static assert(!__traits(compiles, d1 .wrap!Refreshable));
static assert(!__traits(compiles, h1 .wrap!Refreshable));
static assert(!__traits(compiles, hs1 .wrap!Refreshable));
// 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;
Quack qhs = hs1 .wrap!Quack;
assert(qh .quack() == 2); // calls Human.quack
assert(qhs .quack() == 3); // calls HumanStructure.quack
// structural downcast
Human h2 = qh .unwrap!Human;
HumanStructure hs2 = qhs .unwrap!HumanStructure;
assert(h2 is h1);
assert(hs2 is hs1);
// structural upcast (two steps)
Quack qx = h1 .wrap!Quack; // Human -> Quack
Quack qxs = hs1 .wrap!Quack; // HumanStructure -> Quack
Flyer fx = qx .wrap!Flyer; // Quack -> Flyer
Flyer fxs = qxs .wrap!Flyer; // Quack -> Flyer
assert(fx .height == 20); // calls Human.height
assert(fxs .height == 30); // calls HumanStructure.height
// strucural downcast (two steps)
Quack qy = fx .unwrap!Quack; // Flyer -> Quack
Quack qys = fxs .unwrap!Quack; // Flyer -> Quack
Human hy = qy .unwrap!Human; // Quack -> Human
HumanStructure hys = qys .unwrap!HumanStructure; // Quack -> HumanStructure
assert(hy is h1);
assert(hys is hs1);
// strucural downcast (one step)
Human hz = fx .unwrap!Human; // Flyer -> Human
HumanStructure hzs = fxs .unwrap!HumanStructure; // Flyer -> HumanStructure
assert(hz is h1);
assert(hzs is hs1);
Example
import std .traits : functionAttributes, FunctionAttribute;
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-2018 by the D Language Foundation | Page generated by ddox.