日々精進時々堕落

| CALENDAR | RECOMMEND | ENTRY | COMMENT | TRACKBACK | CATEGORY | ARCHIVE | LINK | PROFILE | OTHERS |
スポンサーサイト 2010.10.02 Saturday

一定期間更新がないため広告を表示しています

| - | - | - | スポンサードリンク |
C++ Style Cast Shortcut 2010.08.24 Tuesday
 C++スタイルのキャストって単純に書いててたるいよなーとか思ったりした今日の夕暮れ。

C++スタイルのキャストって単純に文字数が多い。C言語からC++に移行した際にこのスタイルのキャストがめんどいって思った人は少なくないはず。しかもベテランの人ほどC言語スタイルのキャストでも問題が全然起こさなかったりする。結局この長さがC++スタイルのキャストをプログラマに使いづらくしていると思う。
 
まぁ、そもそもキャストなんか発生すると内容によってはオーバーヘッドが発生するので基本的にそんな設計にすんなよーというのは大前提にあるとして、実際のところ、unsignedとsigned整数の変換とかfloatと整数の変換ってのはところどころで出てくるわけで。

で、static_castとか頑張って使うわけなんですけど、やっぱり長い。長いよ。意味的には分かるけど、誤解されることも理解して言うけど、コード中に「たかが」キャストにそれだけの文字情報を使うと逆に読みづらくなるソースは少なくない。基本的に単純で基本的なものほど省略する価値があって、複雑で特殊なものほど長くしっかりとした名前で書くべきだというのが僕のコーディング上の命名の信条にあるわけです。

ということで、考えてみた。

その1 マクロ編。
#define SCAST(type, value) static_cast<TYPE>(value)
#define CCAST(type, value) const_cast<TYPE>(value)
#define DCAST(type, value) dynamic_cast<TYPE>(value)
#define RCAST(type, value) reinterpret_cast<TYPE>(value)

//usage
float fvalue = 12.3f;
int ivalue = SCASt(int, fvalue);

短くはなるものの、何かイカしてる感じがしない。
そこで、もうちょっとおいちゃん考えたヨ。

その2 テンプレート関数編
template<typename out, typename in> __forceinline out scast(in value){ return static_cast<out>(value); }
template<typename out, typename in> __forceinline out ccast(in value){ return const_cast<out>(value); }
template<typename out, typename in> __forceinline out rcast(in value){ return reinterpret_cast<out>(value); }
template<typename out, typename in> __forceinline out dcast(in value){ return dynamic_cast<out>(value); }

// usage
float fvalue = 12.3f;
int ivalue = scast<int>(fvalue);

static_castの文法を変えずに短くなった。速度的にも最適化かかって変わらないはず。
え?コンパイル時間が長くなるって?そうかも。まぁこんなのもアリってことで。
自宅の趣味プログラムで使い勝手を試してみよう。

そんなことより綺麗なソースかけば関係ないって?俺もそう思う。

| プログラム | comments(0) | trackbacks(0) | Dr.Garugari |
スポンサーサイト 2010.10.02 Saturday
| - | - | - | スポンサードリンク |
Comment








Trackback
この記事のトラックバックURL: http://garugari.jugem.jp/trackback/556
<< NEW | TOP | OLD>>