/ 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. 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
-- ä¼¼ã¦ã‚‹ã‹ã‚‚
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
#include <iostream> //------------------------------ ã‚らゆるfunctorã®å…ƒ class FunctorBaseClass{ public: // 仮想関数ã§å®Ÿè¡Œã®ã•ã‚Œã‹ãŸã®ã¿ã‚’定義ã™ã‚‹ï¼Ž // (ã“ã“ã§ã¯()演算åã®ã‚ªãƒ¼ãƒãƒ¼ãƒãƒ¼ãƒ‰ï¼‰ virtual double operator()(double val){}; }; //------------------------------ å…ˆã®ã‚¯ãƒ©ã‚¹ã®ç¶™æ‰¿ template <class TClass> class SpecificFunctor : public FunctorBaseClass{ public: // pt2func : メンãƒé–¢æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ double (TClass::*pt2func)(double); // pt2obj ; インスタンスã¸ã®ãƒã‚¤ãƒ³ã‚¿ TClass* pt2obj; SpecificFunctor(TClass* _pt2obj, double(TClass::*_pt2func)(double)){ pt2obj = _pt2obj; // TClassインスタンスã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’メンãƒå¤‰æ•°ã¸ä»£å…¥ pt2func = _pt2func; // TClassメンãƒé–¢æ•° ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’メンãƒå¤‰æ•°ã¸ä»£å…¥ } virtual double operator()(double val){ // インスタンス.メンãƒé–¢æ•°(引数) ã®å½¢ã§å®Ÿè¡Œ return (*pt2obj.*pt2func)(val); } }; //------------------------------ 処ç†(1) class PlusOne{ public: double func(double val) { return val+1; } }; //------------------------------ 処ç†(2) class PlusA{ public: double a; PlusA(double _a) { a = _a; } double func(double val) { return val+a; } }; //------------------------------ 使用例 int main(){ PlusOne obj1; PlusA obj2(2); // インスタンスã¨å®Ÿè¡Œã™ã‚‹ãƒ¡ãƒ³ãƒé–¢æ•°ã‚’引数ã«ã¨ã£ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä½œæˆ SpecificFunctor< PlusOne > specFunc1(&obj1, &PlusOne::func); SpecificFunctor< PlusA > specFunc2(&obj2, &PlusA ::func); // 継承元ã®ã‚¯ãƒ©ã‚¹ã®ãƒã‚¤ãƒ³ã‚¿ã®é…列ã«ä»£å…¥å‡ºæ¥ã‚‹ FunctorBaseClass* vTable[] = { &specFunc1, &specFunc2 }; // 実行ã—ã¦ã¿ã‚‹ std::cout << "PlusOne::func(1) = " << (*vTable[0])(1) << std::endl; std::cout << "PlusA ::func(1) = " << (*vTable[1])(1) << std::endl; return 0; }