dynamic classes and duck typing

Pelle Månsson pelle.mansson at gmail.com
Mon Nov 30 14:21:32 PST 2009


Simen kjaeraas wrote:
> On Mon, 30 Nov 2009 23:13:23 +0100, Pelle Månsson 
> <pelle.mansson at gmail.com> wrote:
> 
>> Walter Bright wrote:
>>> Bill Baxter wrote:
>>>> On Mon, Nov 30, 2009 at 1:00 PM, Walter Bright
>>>>>    void opDispatch(string name, T...)(T values...)
>>>>>                                               ^^^
>>>>
>>>> You didn't use to have to do that with variadic templates.  Is that
>>>> also a new change in SVN?
>>>  I believe it was always like that.
>>>
>> What do you mean? Not the D I played with?
>>
>> void test1(T...)(T ts) {
>>      writeln(ts); //works as expected
>> }
>> void test2(string s, T...)(T ts) {
>>      writeln(s);  // requires manual specifying of each type
>>      writeln(ts); // e.g. test2!("foo", int, int)(1,2)
>> }
>> void test3(string s, T...)(T ts...) {
>>      writeln(s);  // silently dies when called with
>>      writeln(ts); // test3!("foo")(1,2,3,4) in v2.034
>> }
> 
> It would seem Walter is right, but only for opDispatch. This compiles
> fine. If you want compile errors, move the ellipsis around:
> 
> 
> struct foo {
>     void opDispatch( string name, T... )( T value... ) {
>     }
>     
>     void bar( T... )( T args ) {
>     }
> }
> 
> void main( ) {
>     foo f;
>     f.bar( 3 );
>     f.baz( 3.14 );
> }
> 
So, why have this special case for opDispatch? Maybe I am missing something.



More information about the Digitalmars-d mailing list