to_stringとto_wstring

to_stringとto_wstringはintなどを文字列にして返す標準ライブラリ関数。便利なのだが、charとwchar_tで分かれているので汎用コードを書きたいときにそのまま書きたくない。Windowsはもはやwchar_tが主流だしLinuxではcharが主流でwchar_tは4バイトになることが多い。よってこれらをそのまま使うと汎用性がなくなる。

テンプレート関数

これらの関数をテンプレート関数にしたいとき、テンプレート引数は2つになり、最初の引数はcharかwchar_t、次の引数はintやdoubleとなる。テンプレート関数は部分特殊化ができないので、これらの組み合わせすべて書くしかなくなって効率が悪い。

テンプレートクラス

テンプレートクラスは部分特殊化ができるので、これを利用して汎用関数をつくりたい。文字列クラスのデフォルトをWindowsならwchar_tとしそれ以外ならcharとして扱えば同じ関数記述にできる。

汎用テンプレートクラスの定義

これは実体化されることを想定してないので、static_assert常に失敗。
次にcharの部分特殊化

同様にwchar_t

ここまではユーザは意識しないコード。次がユーザが呼ぶ関数。

SYSTEM_CHAR_TYPEは事前にtypedefされているcharかwchar_t。

テストコード

bool追加

to_stringにはboolがなく、intとして解釈されるようなのでboolも完全特殊化で定義

ソース:https://github.com/ambiesoft/lsMisc/blob/master/stdosd/stdosd.h

考察

C++にはもともとstreamがあって、それを使えばすべて汎用関数で書けそう。しかしto_stringとかの実装はそうなってないようなのでスルー。

これとは逆の関数。文字列からintなどに変える関数は引数に文字列しか入らないので型の推論ができないのでそれぞれの型ごとに別関数にするしかないものと思われる。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)