OpenSiv3Dで使われているユーザー定義リテラル
こんばんは、めのんです!
前回予告した通り、今夜のブログはOpenSiv3Dで使われているユーザー定義リテラルについての話題です。
C++の勉強がある程度進んだ段階でユーザー定義リテラルのことを知りましたが、そのときは「ふーん」という感じであまり興味を持ちませんでした。 せいぜい、虚数に使うとか、std:string型の文字列の生成に使うとか、時間や距離などの物理量に単位を付けるぐらいだろうと思っていたからです。
でも、こういった予想は見事に裏切られますね。 OpenSiv3Dのサンプルプログラムを眺めているうちに見つけましたよ。 そう、ユーザー定義リテラルを、です。
ちょっと調べてみたところ、フォーマット指定子というのに使っているようです。
どうやら、
U"Siv{}D"_fmt(3)
と書けば、{}の部分に_fmtのあとの括弧に並べた実引数の評価結果の値が入るようです。
Cのprintf系関数と似たような用途なんでしょうね。 どんな言語もこうした書式化にはいろんな工夫が見られます。 そういえば、Zigでは無名構造体に無名フィールドを並べるというやり方をしていましたが、それに比べればまだわかりやすかったですよ。
_fmtを末尾につけたユーザー定義リテラルはdetail::FormatHelperクラスのオブジェクトに評価されるようです。 そして前回と同じで、detail::FormatHelperオブジェクトは関数呼び出し演算子がオーバーロードされているんですねー。
私は前もってそこそこC++を勉強していたので読み解けましたが、C++の勉強を始めたばかりだとさっぱりわからなかったと思います。
もともとC++の勉強のための題材としてOpenSiv3Dを触り始めましたので、こんな風にいろんな言語仕様を盛り込んでくださっているのは私としてはむしろ大歓迎です。 チームで開発するときにはメンバーを集めるのが大変そうですけどね(^_-)-☆
平日はPHPの勉強もしないといけませんし、そもそもどれだけ時間がとれるかわからないので、OpenSiv3Dを触るのはしばらくお預けになるかもしれません。 ゆっくりしたペースですけど勉強は続けていきますので、どうか暖かく見守ってください。
それでは!!