floatだったりdoubleだったりするCGFloatの定数をどう書くか問題

いや全然問題ってほどじゃないんだけど。

CGFloatは今まではfloatだったので、例えば

みたく何気なく数値に ‘f’ を付けて単精度浮動小数点リテラルにしてたのですが。

これが64bitのarm64バイナリ向けのビルドではCGFloatがdoubleになった。
armv7/armv7s/arm64 の3バイナリをファットバイナリにぶっこむ現状ではCGFloatがfloatだったりdoubleだったりする。なので f を付けるとarm64用コンパイルでdoubleに単精度リテラルを渡すことになり、かといって f を外すとarmv7(s)用コンパイルでfloatに倍精度リテラルを渡すことになってしまう。

さて、ではどうするか。

・そんなとこ気にしても仕方ない。気にしない。すでにfを付けてしまってるものは放っておく。
・今後時間が経つにつれ32bit端末はどんどん減っていくので、今後書くコードについてはCGFloatの定数に f を付けるのをやめる

落としどころはこんなところだろうか。

しかし。しかしである。
doubleに単精度リテラルを代入したりfloatに倍精度リテラルを代入したりするのは気に喰わーーーんヽ(`Д´)ノ!!!!という人もいるであろう。いませんか? いますよね。 ぼくだけじゃないですよね。。。。

というワケで、C++11の中で「あってもなくてもどうでもいい新機能選手権」で必ず上位に入賞する「ユーザー定義リテラル」を使った解決を試みる。

どっかのヘッダにこれを書いておくと、 1.0_cgf とか 320.0_cgf って記述するとこれがCGFloatリテラルになる。
つまり、32bitバイナリの時はfloatのCGFloatリテラルに、64bitバイナリの時はdoubleのCGFloatリテラルになる。

ブラボー!

ただし、 1.0_cgf って記法はなんなのよ。アンダースコア気に喰わねー! ユーザー定義リテラル要らねー! っていう意見はごもっともである。
あとC++11 を有効にするために .m ファイルを .mm ファイルにしなきゃいけない。

まあなんというか、こんなことしても実行速度とかこれっぽっちも改善しないだろうし自己満足にしかならんのは判ってます。はい。