2007-07-22

[]C#にあるようなプロパティもどき

getter/setterを関数で書くと、後ろに()を付けないといけないから格好悪い!!

って人にオススメ

template<typename T>struct _property{

  virtual operator T() = 0;

  typedef T _t;

};

class asdf{

  int foo;

public:

  struct __foo : _property<int>{

    asdf &parent;

    operator _t(){

      printf("親クラス(?)のメンバへのアクセスが面倒...");

      return parent.foo;

    }

    __foo(asdf &p) : parent(p){}

  }y;

  struct : _property<char*>{

    operator _t(){

      printf("ここに副作用付き処理を書ける!?\n");

      printf("この関数が参照を返せばgetもどきも実装できる!?\n");

      return "ふひひひ!やったね!!";

    }

  }x;

  asdf(int v) : y(*this){ foo = v * v - v - v; }

};

void p(char*s){ printf("\n増田はこちらを振り返ると、\n悲しそうな顔をしてこう言った\n「%s」\n", s); }

int main(){

  asdf a(127);

  //生でprintfに渡すと型推論が行われない

  //それ以外の関数だったら問題ないかも

  p(a.x);

  printf("\n");

  //どうしてもと言うならキャストすべし

  printf("\n%d\n", (int)a.y);

  return 0;

}


VC8で動作確認してるよ!

はっきり言って普通にgetter/setter書くよりも手間多いね!

あとcppシンタックス表示使うと文字化けしちゃうから引用ブロックに入れておいたよ!

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん