On Sunday, 22 April 2012 at 18:42:19 UTC, Brad Anderson wrote:
On Sun, Apr 22, 2012 at 4:24 AM, Gor Gyolchanyan <
gor.f.gyolchan...@gmail.com> wrote:

Voldemort types (coined by Andrei Alexandrescu) are types, which can't
be named. Like so:

auto getMisteriousData(int i)
{
   struct Mysterious
   {
       int i;
   }

   return Mysterious(i);
}

The only way to use mysterious structure is to either do this:

auto m = getMysteriousData(12);

or

ReturnTypeOf!getMysteriousData m;

Here's a very handsome use case of this setup:

class Set(T)
{
public:
   auto opIndex(T datum_)
   {
       struct Command
       {
       public:
           alias _datum this;

           bool contains() @property
           {
               return (_datum in _set) !is null;
           }

           void add()
           {
               _set._data[_datum] = false;
           }

           void remove()
           {
               _set._data.remove(_datum);
           }

       private:
           Set _set;
           T _datum;
       }
   }

private:
  bool[T] _data;
}

this will allow you do use Set class like this:

auto s = new Set!int;
assert(!s[6].contains);
s[6].add();
assert(s[6].contains);
s[6].remove();
assert(!s[6].contains);

This will get even better if the voldemort Command structure, returned by opIndex would include the same pattern, allowing to chain the
parameters and actions in any way desirable.

--
Bye,
Gor Gyolchanyan.


That's really neat. We need to start making a catalog of interesting stuff
you can do in D.

Regards,
Brad Anderson

Be sure to add support for this also in the example:

if(auto e = s[6]) // implicit contains
  e.remove();

Reply via email to