シングルトンなメソッドを静的な関数にしたい

こんにちは、マツノブです。

 

今回もプログラムの話をしていきましょう。

皆さんはシングルトンクラスのメソッドをコールバックとして呼ぶためにヘルパ関数を作ったこともあると思います。

あれってすごく面倒ですよね。

↑のようなコードを書いた後に SingletonClass::func の引数をintからfloatに変更したのに SingletonHelper 関数の引数がintのままになっていて予期せぬ不具合に遭遇するという苦い記憶があるプログラマも多いでしょう。

 

今回はそんな面倒なヘルパ関数を自動生成する方法を考えていこうと思います。

↑に記述したマクロを使用して前述のSingletonHelperを実装すると

となります。

 

それでは順を追って見ていきましょう。まず最初に

が展開されて

となって

になります。

 

decltype(SingletonMethod::GetFunctionType(&SingletonClass::func))

は decltype によって SingletonMethod::GetFunctionType(&SingletonClass::func) の戻り値である

_SingletonMethod<SingletonClass, void, int> と解釈されます。

最後に auto SingletonHelper が右辺値 _SingletonMethod<SingletonClass, void, int>::call<&SingletonClass::func>  によって型推論により関数ポインタに置き換わります。

今回の説明では関数ポインタに代入していますが

のようにコールバック関数を設定する関数に直接代入すればヘルパ関数の名前を考える必要もなくなります。

_SingletonMethod と _SingletonMethod_const を用意する必要がないようにも見えますがVisualStudio環境下ではconstメソッドと非constメソッドでのテンプレート引数のオーバーロードを行うとdecltypeの展開に失敗する場合があったので泣く泣く2つに分けました。

 

テンプレートとマクロで長々と回りくどいコードを書きましたがこれ一つでヘルパ関数の実装や保守から開放されると思うとちょっと嬉しい気持ちになりませんか?

それでは皆さん良いプログラミングライフを

Tweet about this on TwitterShare on Facebook0Share on Google+0

コメント投稿は締め切りました。