2012年12月18日 星期二

C++ 非靜態成員函式指標語法

C/C++ 語言裡的一個特色是函式 (function) 可視為一級物件 (First-Class Object), 即函數可被當成變數供另一個函數做為參數使用. 對比缺少此特色的語言 (Ex: Java) 來說, 語法上較易表示交付 Callback 或指派 Delegate 等等的應用.

可能是因為 C/C++ 本身的歷史關係, 函數指標的型別宣告方式還蠻艱誨深澀, 基本的全域靜態函式的指標宣告和傳遞可能就能讓許多 Programmer 停下來翻書查語法了. 更別說 C++ 中引入的非靜態成員函式指標語法. 這邊筆記一下網路的參考資料和範例:



C++ Syntax: Pointer-to-member-function

範例:

#include <iostream>

class Abc
{
public:
    // A target callback function with type: 'bool (Abc::*)(const char*)'
    bool haha(const char *str)
    {
        std::cout << "haha(): " << str << std::endl;
        return (str != NULL);
    }
};

class Def
{
public:
    // Invoker: pass instance by ref
    void invoke (bool (Abc::*func)(const char *str), Abc &instance)
    {
        (instance.*func)("test");
    }

    // Invoker: pass instance by addr
    void invokeptr (bool (Abc::*func)(const char *str), Abc *instance)
    {
        (instance->*func)("test"); // '.*' is replaced by '->*'
    }
};

int main(int argc, char *argv[])
{
    Abc abc;
    Def def;

    def.invoke(&Abc::haha, abc);
    def.invokeptr(&Abc::haha, &abc);
    return 0;
}

沒有留言:

張貼留言