メンバ関数を関数ポインタに代入

きっかけ

この記事を見て、以前自分も手こずってそのまま放置していたことを思い出したからコードを書いてみた。

問題

メンバ関数のポインタを関数ポインタに代入できない

class myclass {
public:
    int foo();
};

int main() {
    myclass c;
    void (*func)() = c.foo;  // ビルドエラーが発生
    func();
}

解決策

  1. メンバ関数ポインタを取得
  2. boost::bindを使う
1.メンバ関数ポインタを取得
#include <stdio.h>

class myclass {
public:
    myclass();
    void foo();
    int value;
};

myclass::myclass() {
    value = 5;
}

void myclass::foo() {
    printf("myclass::foo i = %d\n", value);
}

int main() {
    myclass c;
    void (myclass::*func)() =&myclass::foo;
    (c.*func)();
}

参考サイト http://www.geocities.jp/ky_webid/cpp/language/034.html

2. boost::bindを使う
#include <stdio.h>
#include <boost/bind.hpp>
#include <boost/function.hpp>

class myclass {
public:
    myclass();
    void foo();
    int value;
};

myclass::myclass() {
    value = 5;
}

void myclass::foo() {
    printf("myclass::foo i = %d\n", value);
}

int main() {
    myclass c;
    boost::function<void ()> func = boost::bind(&myclass::foo, c);
    func();
}