www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - equivalent of C++ implicit constructors and conversion operators

reply #ponce <spam spam.spam> writes:
In C++ implicit constructors and conversion operators allow a user-defined type
to act quite like a builtin-type.

  struct half
  {
      half(float x);l
      inline operator float() const;
  }

allows to write:

  half x = 1.f;
  float f = x;

and this is especially useful for templates. 
I couldn't find a similar construct in D, is there any?
Apr 23 2010
parent reply Robert Clipsham <robert octarineparrot.com> writes:
On 23/04/10 17:22, #ponce wrote:
 In C++ implicit constructors and conversion operators allow a user-defined
type to act quite like a builtin-type.

    struct half
    {
        half(float x);l
        inline operator float() const;
    }

 allows to write:

    half x = 1.f;
    float f = x;

 and this is especially useful for templates.
 I couldn't find a similar construct in D, is there any?
A combination of alias this and opAssign should work: ---- struct half { float f; alias f this; half opAssign(float fl) { f = fl; return this; } } void main() { half x; // For some reason I got a compilation error with half x = 1f; x = 1f; float f = x; } ----
Apr 23 2010
parent Philippe Sigaud <philippe.sigaud gmail.com> writes:
On Fri, Apr 23, 2010 at 18:46, Robert Clipsham <robert octarineparrot.com>wrote:

 On 23/04/10 17:22, #ponce wrote:

 In C++ implicit constructors and conversion operators allow a user-defined
 type to act quite like a builtin-type.

   struct half
   {
       half(float x);l
       inline operator float() const;
   }

 allows to write:

   half x = 1.f;
   float f = x;

 and this is especially useful for templates.
 I couldn't find a similar construct in D, is there any?
A combination of alias this and opAssign should work: ---- struct half { float f; alias f this; half opAssign(float fl) { f = fl; return this; } } void main() { half x; // For some reason I got a compilation error with half x = 1f; x = 1f; float f = x; }
Could the compilation error comes from the compiler rewriting half f = 1f; into half f(1f); or somesuch and trying to call a constructor? I'm tearing my hair due to errors/confusions between constructors and opCall for structs. Anyway, in your example, adding this(float f) { this.f = f;} is enough to get half f = 1f; to compile.
Apr 23 2010