Posted By

tkf on 05/24/08


Tagged

functor


Versions (?)

C++でFunctorによる処理の切り替え


 / Published in: C++
 

参考: 1. http://www.newty.de/fpt/functor.html -- ほとんど、このコードにコメントを加えただけですw 2. http://d.hatena.ne.jp/nurs/20080125/1201278130 -- 最初このページを見つけたのですが、この方法だと実行時にファンクタ(関数オブジェクト)を作って、配列に入れて処理を切り替え、ってことが出来ないと思ったので、このコードを書きました。 3. http://www.mokehehe.com/assari/index.php?C%2B%2B%2F%A5%E1%A5%F3%A5%D0%B4%D8%BF%F4%A4%CE%A5%DD%A5%A4%A5%F3%A5%BF -- 似てるかも

  1. #include <iostream>
  2. //------------------------------ あらゆるfunctorの元
  3. class FunctorBaseClass{
  4. public:
  5. // 仮想関数で実行のされかたのみを定義する.
  6. // (ここでは()演算子のオーバーロード)
  7. virtual double operator()(double val){};
  8. };
  9. //------------------------------ 先のクラスの継承
  10. template <class TClass>
  11. class SpecificFunctor : public FunctorBaseClass{
  12. public:
  13. // pt2func : メンバ関数へのポインタ
  14. double (TClass::*pt2func)(double);
  15. // pt2obj ; インスタンスへのポインタ
  16. TClass* pt2obj;
  17. SpecificFunctor(TClass* _pt2obj, double(TClass::*_pt2func)(double)){
  18. pt2obj = _pt2obj; // TClassインスタンスへのポインタをメンバ変数へ代入
  19. pt2func = _pt2func; // TClassメンバ関数 へのポインタをメンバ変数へ代入
  20. }
  21. virtual double operator()(double val){
  22. // インスタンス.メンバ関数(引数) の形で実行
  23. return (*pt2obj.*pt2func)(val);
  24. }
  25. };
  26. //------------------------------ 処理(1)
  27. class PlusOne{
  28. public:
  29. double func(double val) {
  30. return val+1;
  31. }
  32. };
  33. //------------------------------ 処理(2)
  34. class PlusA{
  35. public:
  36. double a;
  37. PlusA(double _a) {
  38. a = _a;
  39. }
  40. double func(double val) {
  41. return val+a;
  42. }
  43. };
  44. //------------------------------ 使用例
  45. int main(){
  46. PlusOne obj1;
  47. PlusA obj2(2);
  48.  
  49. // インスタンスと実行するメンバ関数を引数にとってインスタンス作成
  50. SpecificFunctor< PlusOne > specFunc1(&obj1, &PlusOne::func);
  51. SpecificFunctor< PlusA > specFunc2(&obj2, &PlusA ::func);
  52. // 継承元のクラスのポインタの配列に代入出来る
  53. FunctorBaseClass* vTable[] = { &specFunc1, &specFunc2 };
  54. // 実行してみる
  55. std::cout << "PlusOne::func(1) = "
  56. << (*vTable[0])(1) << std::endl;
  57. std::cout << "PlusA ::func(1) = "
  58. << (*vTable[1])(1) << std::endl;
  59. return 0;
  60. }

Report this snippet  

You need to login to post a comment.