Revision: 6492
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at May 24, 2008 13:01 by tkf
Initial Code
#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;
}
Initial URL
Initial Description
å‚考: 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 -- ä¼¼ã¦ã‚‹ã‹ã‚‚
Initial Title
C++ã§Functorã«ã‚ˆã‚‹å‡¦ç†ã®åˆ‡ã‚Šæ›¿ãˆ
Initial Tags
Initial Language
C++