2010年6月18日金曜日

忘れがちなC++での関数ポインタ

クラス内部で状態によって呼ぶ出す関数を変えるときには関数ポインタを使うと便利ですが、C++では書き方が若干面倒なので、その記録。
#include <cstdlib>
#include <iostream>

class FPSample {
public:

    void function_switch(int sw) {
        switch (sw) {
            case 1: m_pFunctionSample = &FPSample::function1;
                break;
            case 2: m_pFunctionSample = &FPSample::function2;
                break;
            default:
                std::cout << "default" << std::endl;
        }
    }

    bool function(int x) {
        return (this->*m_pFunctionSample)(x);
        // return (*mFunctionSample)(x); // Error
    }
private:
    typedef bool (FPSample::*FUNCTION_SAMPLE)(int);
    FUNCTION_SAMPLE m_pFunctionSample;

    bool function1(int x) {
        std::cout << "function1 : " << x << std::endl;
        return true;
    }

    bool function2(int x) {
        std::cout << "function2 : " << x << std::endl;
        return false;
    }
};

int main(int argc, char** argv) {
    FPSample mFPSample;
    int sw;
    int x;

    x = 10;
    
    sw = 1;
    mFPSample.function_switch(sw);
    mFPSample.function(x);

    sw = 2;
    mFPSample.function_switch(sw);
    mFPSample.function(x);

    return 0;
}

0 件のコメント: