再帰的な関数定義
新エンジンの状態遷移を関数でハンドリングするにあたって、再帰的な関数定義がうまくできずに悩んでいたのですが、まさにそのものズバリの実装を見つけました。
http://www.gotw.ca/gotw/057.htm
テストコードを書いてみます。
#include <iostream> struct Status; typedef Status (*StatusHandler)(const char* msg); struct Status { Status(StatusHandler rhs) : handler_(rhs) { std::cout << "copy constructor" << std::endl; } operator StatusHandler() { std::cout << "Status -> StatusHandler operator" << std::endl; return handler_; } StatusHandler handler_; }; Status f1(const char* msg) { std::cout << "f1 called, msg=" << msg << std::endl; return f1; } int main(int argc, char** argv) { StatusHandler p = f1; p = p("1st"); p("2nd"); return 0; }
実行してみます。
~/src/test $ ./a.out f1 called, msg=1st copy constructor Status -> StatusHandler operator f1 called, msg=2nd copy constructor ~/src/test $
コピーコンストラクタと型変換オペレータの協調動作がなんともエレガントです。素晴しい。