class A{
  int n;
  bool opEquals( A a ){
    return n == a.n;
  }
}

void main(){
}

これはOKで


struct A{
  int n;
  bool opEquals( A a ){
    return n == a.n;
  }
}

void main(){
}

構造体だとだめらしい


newv.d(3): Error: function newv.A.opEquals type signature should be const bool(ref const(A)) not bool(A a)


意味わからん


struct A{
  int n;
  const bool opEquals( ref const( A ) a ){
    return n == a.n;
  }
}

void main(){
}

これならOKらしいけど、仕様だったの?


もちろん驚いてないけど、「最近こういうこと無くなったよ」とか書こうと思ってた矢先の出来事でした



思ったより直すの簡単だったからまあいいや


ところで opDispatch とかって


import std.stdio;

struct S{
  void opDispatch( string s, T ... )( T n ){
    writefln( "S.opDispatch('%s')", s );
    writeln( n );
  }
}

void main(){
    S s;
    s.opDispatch!( "hello" )( 7 );
    s.foo( 8, 9, [ 10, 11 ] );
    s.hoge( 10, "Foo" );
}

OKだけど、で、どうすんだろ

One Response to “Version D 2.037 やるねえ”

  1. Pen.Jr より:

    import std.stdio;
    
    struct A{
      int n;
      void foo( int i ){
        writefln( "A.n = %d", n += i );
      }
    }
    
    struct B{
      A a;
      void opDispatch( string s, T ... )( T n ){
        mixin( "a." ~ s ~ "( n );" );
      }
    }
    void main(){
      B b;
      b.foo( 5 );
    }
    

    構造体の継承に使えるような気もしたが、これは通るけど、返り値とかダメだし

    opDot の補助も無理っぽい

Leave a Reply

© 2010 I am Pen Jr. Suffusion WordPress theme by Sayontan Sinha