Handle to some object, call its methods

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jul 15 10:06:13 PDT 2014


On 07/15/2014 09:39 AM, Anonymous wrote:

 > struct Subscription {
 >      const Object handle;
 >      private immutable size_t index;
 >      @disable this();
 >      private this(Object o, size_t i) {
 >          handle = o;
 >          index = i;
 >      }
 > }
 >
 > I'd like this to be constructed with a handle to some object, and some
 > other details. The source would create and return the Subscriptions, and
 > the reader would call the object's const methods through the handle. The
 > const "read" methods would take the Subscription as one of the arguments.

Object is too general for that. Normally, you would define an interface 
and use that:

interface Reader
{
     int read() const;
}

struct Subscription {
      const Reader reader;
      private immutable size_t index;
      @disable this();
      private this(Reader r, size_t i) {
          reader = r;
          index = i;
      }
}

class ConstantReader(int value) : Reader
{
     int read() const
     {
         return value;
     }
}

void main()
{
     auto sub = Subscription(new ConstantReader!42(), 0);
     assert(sub.reader.read() == 42);
}

Further, if 'index' is the subscription index, usually there is no need 
for that as the Subscription objects can be iterated over in their 
container:

     Subscription[] subs;
     subs ~= Subscription(new ConstantReader!42(), 0);

     foreach (sub; subs) {
         sub.reader.read();
     }

Ali



More information about the Digitalmars-d-learn mailing list