Implicit type conversion of an argument when a function is called
Carl Sturtivant
sturtivant at gmail.com
Tue Feb 11 06:47:30 PST 2014
> With a class you can do this:
> class Data
> {
> string s;
> this(string s)
> {
> this.s = s;
> }
> }
>
> void f(Data x ...)
> {
> import std.stdio;
> writeln(x.s);
> }
>
> void main()
> {
> f("hello"); //convert argument implicitly to type `data`.
> }
>
> See Typesafe Variadic Functions at
> http://dlang.org/function.html
>
> I don't know why you can't do it with a struct.
>
> As a workaround, you can do this:
>
> class Construct(T)
> {
> T t;
> this(Q)(Q q)
> {
> static if(is(Q : T))
> {
> t = q;
> }
> else
> {
> this.t = T(q);
> }
> }
> }
>
> struct Data
> {
> string s;
> }
>
> void f(Construct!Data xC ...) //construct the wrapper class
> {
> auto x = xC.t; //get the contents.
>
> import std.stdio;
> writeln(x.s);
> }
>
> void main()
> {
> f("hello");
> f(Data("world"));
> }
>
>
> Overall it's probably best to define f as:
>
> void f(Data x)
> {
> import std.stdio;
> writeln(x.s);
> }
>
> void f(Construct!Data xC ...)
> {
> .f(xC.t);
> }
>
> To avoid any overhead when calling normally as well as
> separating the definition of the real function from the concern
> of automatic construction/conversion.
Nice technique, I'll remember that. Presumably this can't be
extended to functions with more than one Data parameter.
What a curious corner of the language! I am somewhat mystified as
to the reasoning/intuition behind the presence of this feature
for classes (and not structs). Anybody?
More information about the Digitalmars-d-learn
mailing list