読者です 読者をやめる 読者になる 読者になる

堕(惰)プログラマ開発記録

タイトル変えようかなとも思ってるけれど,思い浮かばない

OAuthAPIのヘルパー

C++ twit-library

サービスによってAPIのヘルパーを間違えないようにするためにこんな風にしてみたんだけど…

class helper_base{
public:
  helper_base(std::string ss) : ss_(ss){}
  std::string get() const{return ss_;}
private:
  const std::string ss_;
};

class A_service_helper_base : helper_base{
public:
  A_service_helper_base(std::string ss) : helper_base(ss){}
};
class A_service_helper : A_service_helper_base{
public:
  A_service_helper(std::string ss) : A_service_helper_base(ss){}
};

class B_service_helper_base : helper_base{
public:
  B_service_helper_base(std::string ss) : helper_base(ss){}
};
class B_service_helper : B_service_helper_base{
public:
  B_service_helper(std::string ss) : B_service_helper_base(ss){}
};

void client_base(helper_base *api){
  std::string ss = api->get();
  //hogehoge
}
void client_service_A(A_service_helper_base *api){
  //hogehoge
  client_base(api);
}
void client_service_B(B_service_helper_base *api){
  //hogehoge
  client_base(api);
}

って定義すれば、

int main(){
  client_service_A(&A_service_helper_base("A_Helper")); //正常
  client_service_A(&B_service_helper_base("B_Helper")); //エラー

  client_service_B(&A_service_helper_base("A_Helper")); //エラー
  client_service_B(&B_service_helper_base("B_Helper")); //正常

  return 0;
}

ってな感じに使えるんじゃないかなと。
これだといろいろ問題ありそうだけど、こんな風に使ってみようかなと思ってる。

この中にバグとか有ったら教えてくれると嬉しいです。