Posted By


tkf on 05/24/08

Tagged


Statistics


Viewed 211 times
Favorited by 0 user(s)

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


/ Published in: C++
Save to your folder(s)

参考:
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
-- 似てるかも


Copy this code and paste it in your HTML
  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


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.