how to use opdot

Steven Schveighoffer schveiguy at yahoo.com
Thu Nov 20 04:59:39 PST 2008


"Ary Borenszweig" wrote
> Steven Schveighoffer wrote:
>> "Morusaka" wrote
>>> Hi,
>>>
>>> I've read about opdot in D language spec operator overload section, but 
>>> the little snippet of code provided isn't enough, for me, to figure out 
>>> what it is supposed to do and how to use it or what it could be usefull 
>>> for.
>>>
>>> Could you please help me to get the right way?
>>
>> opDot is useful if you want to make a 'wrapper' type.  That is, you want 
>> to mimic another type, but you want to slightly alter the behavior. 
>> opDot allows you to 'inherit' all the member functions and fields from 
>> the wrapped type.  For example, if I wanted to create a wrapper type that 
>> added a 'blahblah' integer to the type, I could do this:
>>
>> struct AddBlahBlah(T)
>> {
>>    T _t;
>>    int blahblah;
>>
>>    T *opDot() { return &_t;}
>> }
>>
>> Now, if I declare an AddBlahBlah!(C) and class C has a member foo():
>>
>> C c;
>> AddBlahBlah!(C) abb = AddBlahBlah!(C)(c);
>>
>> abb.foo(); // translates to abb.opDot().foo()
>> abb.blahblah = 5; // sets abb.blahblah to 5, doesn't affect _t
>
> Wow. That's incredibly useful for doing decorators!
>
> http://en.wikipedia.org/wiki/Decorator_pattern

Not exactly ;)  The wrapped type is not equivalent to inheritance.

For example, if you have a function that takes a class C, you can't pass an 
AddBlahBlah!(C) type into it.

However, a template function which expects a type C or a wrapped C, could 
possibly be used as you say.

-Steve 




More information about the Digitalmars-d-learn mailing list