[Issue 5719] New: [patch] std.conv.to should support structs with custom converters in addition to objects
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Mon Mar 7 21:53:59 PST 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5719
Summary: [patch] std.conv.to should support structs with custom
converters in addition to objects
Product: D
Version: D2
Platform: Other
OS/Version: Windows
Status: NEW
Keywords: patch
Severity: normal
Priority: P3
Component: Phobos
AssignedTo: nobody at puremagic.com
ReportedBy: sandford at jhu.edu
--- Comment #0 from Rob Jacques <sandford at jhu.edu> 2011-03-07 21:50:57 PST ---
Currently std.conv.to allows classes to define custom conversion routines to
non-class types, but doesn't provide structs with the same functionality. This
functionality can be extended to structs by a minor change in one of the toImpl
template constraints from
is(S : Object) && !is(T : Object)
to
((is(S : Object) && !is(T : Object)) || is(S == struct))
The particular toImpl is currently located at Line 687 in git (line 680 in DMD
2.051) and has been reproduced in full below with the patch, along with an
updated unit test. The patch passes the unit tests below and the unit tests in
my current fork of std.variant and std.json, but I haven't tested it against
the entire phobos test suite.
/**
Object-_to-non-object conversions look for a method "to" of the source
object.
Example:
----
class Date
{
T to(T)() if(is(T == long))
{
return timestamp;
}
...
}
unittest
{
debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, "
succeeded.");
auto d = new Date;
auto ts = to!long(d); // same as d.to!long()
}
----
*/
T toImpl(T, S)(S value) if ( ((is(S : Object) && !is(T : Object)) || is(S ==
struct)) && !isSomeString!T
&& is(typeof(S.init.to!(T)()) : T))
{
return value.to!T();
}
unittest
{
debug(conv) scope(success) writeln("unittest @", __FILE__, ":", __LINE__, "
succeeded.");
class B { T to(T)() { return 43; } }
auto b = new B;
assert(to!int(b) == 43);
struct C { T to(T)() { return 43; } }
C c;
assert(to!int(c) == 43);
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list