再帰的な関数定義

新エンジンの状態遷移を関数でハンドリングするにあたって、再帰的な関数定義がうまくできずに悩んでいたのですが、まさにそのものズバリの実装を見つけました。
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 $

コピーコンストラクタと型変換オペレータの協調動作がなんともエレガントです。素晴しい。