昨日はライブデモンストレーションでたくさんの患者さんを治療させて頂きました。全員成功裏に終了してとても嬉しいです。いったい何人の患者さんを治療したのか自分でも分かりません。ずっと立ちっぱなしですのでやはり疲れましたが、元気です。
まだ緊張しているのか 2:00AMに覚醒してしまいました。そして、眠りに再びつけるように、C++の関数オブジェクト(ファンクタ)について考えていました。何故それが必要なのだろうか? その必要性がある奥の深い世界に入りたい、そんなふうに考えていてふと疑問がおこりました。そして、テスト・プログラムを書いたのです
いやいやその前に色々と調べました、2つの大きな疑問が解決しました
-
Mac OSX Lionでバックスラッシュを打つにはどうすればよいか?
これに対しては、簡単に解決法が見つかりました Option + \なのです \は円記号です
-
Mac OSX Lion + NetBeansでコンソール文字化けを解決するにはどうするか?
これは
・NetBeansのコンソール文字化け対策
/Applications/NetBeans/NetBeans 7.2.app/Contents/Resources/NetBeans/etc/netbeans.conf
のnetbeans_default_optionsに以下を追加
-J-Dfile.encoding=UTF-8
#include <iostream> class biggerThanFour { public: bool operator() (int val) { return (val > 4); } }; bool btf(int val) { return (val > 4); } int main() { std::cout << "関数オブジェクト使用\n"; biggerThanFour num; for (int i=0; i<10; i++) { std::cout << "[" << i << "]は"; if (num(i)) std::cout << "4より大きい\n"; else std::cout << "4と同じか小さい\n"; } std::cout << "\n関数の使用\n"; for (int i=0; i<10; i++) { std::cout << "[" << i << "]は"; if (btf(i)) std::cout << "4より大きい\n"; else std::cout << "4と同じか小さい\n"; } bool (*functionP)(int) = btf; std::cout << "\n関数ポインタ使用\n"; for (int i=0; i<10; i++) { std::cout << "[" << i << "]は"; if (functionP(i)) std::cout << "4より大きい\n"; else std::cout << "4と同じか小さい\n"; }
結果は
関数オブジェクト使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい
関数の使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい
関数ポインタ使用
[0]は4と同じか小さい
[1]は4と同じか小さい
[2]は4と同じか小さい
[3]は4と同じか小さい
[4]は4と同じか小さい
[5]は4より大きい
[6]は4より大きい
[7]は4より大きい
[8]は4より大きい
[9]は4より大きい
実行 SUCCESSFUL (合計時間: 60ms)
さてここで疑問です あれっ? 当たり前かも知れないけど、結果は同じじゃん です。となると、どうしてこんなに複雑なことせねばならないのでしょうか? それについて考察が必要です。まあ今後調べましょう。
ただ、今分かったことは、関数オブジェクト、これはファンクタ (Functor)とも呼ばれるようですが、関数オブジェクトの場合にはあくまでもオブジェクトなので、その中に何らかのデータを内在できそうです。
では、関数ポインタの出番は何でしょうか? 何でもコールバック関数の引数として良く使われるそうですが、まだ僕には理解が難しいのです。勉強が必要ですね。