www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Wrapping an arbitrary class/struct API

reply Joseph Rushton Wakeling <joseph.wakeling webdrake.net> writes:
Hello all,

(This accidentally got posted as a reply to someone else's thread -- I'm 
reposting in order to make sure that thread doesn't get diverted.)

Suppose that I have a struct like e.g.:

     struct A
     {
         void foo(int n) { ... }
         void foo(Range)(Range r) { ... }
         int bar() { ... }
         int bar(double x) { ... }
         // ... and others ...
     }

... an I want to wrap it in another struct, B.  If I do this manually it would 
be something like,

     struct B
     {
         private A a;
         void foo(int n) { return a.foo(n); }
         void foo(Range)(Range r) { return a.foo(r); }
         // ... etc ...
     }

But suppose that I don't a priori know the list of functions (and function 
arguments) that need to be wrapped.  How could I go about working this out,
with 
a generic programming approach, i.e. _without_ manually writing the individual 
cases?

More specifically, how could I work this out limited to a specific function of
A 
(say, foo) ... ?

Thanks & best wishes,

     -- Joe
Aug 24 2013
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Saturday, 24 August 2013 at 13:14:30 UTC, Joseph Rushton 
Wakeling wrote:
 Hello all,

 (This accidentally got posted as a reply to someone else's 
 thread -- I'm reposting in order to make sure that thread 
 doesn't get diverted.)

 Suppose that I have a struct like e.g.:

     struct A
     {
         void foo(int n) { ... }
         void foo(Range)(Range r) { ... }
         int bar() { ... }
         int bar(double x) { ... }
         // ... and others ...
     }

 ... an I want to wrap it in another struct, B.  If I do this 
 manually it would be something like,

     struct B
     {
         private A a;
         void foo(int n) { return a.foo(n); }
         void foo(Range)(Range r) { return a.foo(r); }
         // ... etc ...
     }

 But suppose that I don't a priori know the list of functions 
 (and function arguments) that need to be wrapped.  How could I 
 go about working this out, with a generic programming approach, 
 i.e. _without_ manually writing the individual cases?

 More specifically, how could I work this out limited to a 
 specific function of A (say, foo) ... ?

 Thanks & best wishes,

     -- Joe
You might want to look at std.typecons.Proxy also, opDispatch is a very powerful tool for doing this sort of thing.
Aug 24 2013
parent Joseph Rushton Wakeling <joseph.wakeling webdrake.net> writes:
On 24/08/13 15:31, John Colvin wrote:
 You might want to look at std.typecons.Proxy
 also, opDispatch is a very powerful tool for doing this sort of thing.
Thanks, I'll take a look :-)
Aug 24 2013