C++プログラマ キャスブログ
[C++]型を自在に変換~キャスト演算子のオーバーロード~ 2014年12月05日11:45:05
キャスト演算子のオーバーロードを行っておくと必要な型に応じて 暗黙的にキャストを行ってくれます。 自在に好きな型へと変換でき便利です。 乱用すると黒魔術化するのでご利用は計画的に! 異論があるかもしれませんが、筆者はこの機能が大好きです。 書き方: operator 型() 修飾子 この機能を利用して参照を返す事は可能ですが暗黒面に足を踏み入れる トリッキーなコードになってしまいますので参照の利用は控えた方がいいと思います。 ※ただし読み取り専用のconst参照であればいいと考えます。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #include <cstdio> // printfに必要なヘッダー #include <string> // stringに必要なヘッダー // 整数クラス class Integer { private: int m_Int; public: Integer(int i = 0) { m_Int = i; } // intキャスト演算子のオーバーロード operator int() const { return m_Int; } // doubleキャスト演算子のオーバーロード operator double() const { return (double)m_Int; } // std::stringキャスト演算子のオーバーロード operator std::string() const { char buffer[16] = {}; sprintf( buffer, "%d", m_Int ); return buffer; } }; void Print( int i, double d, const std::string& s ) { printf( "int=%d, double=%f, string=%s\n", i, d, s.c_str() ); } int main() { Integer integer = 10; int i = integer; // intキャスト演算子が呼ばれる double d = integer; // doubleキャスト演算子が呼ばれる std::string s = integer; // std::stringキャスト演算子が呼ばれる // 変数を出力 printf( "int=%d, double=%f, string=%s\n", i, d, s.c_str() ); // 手動で呼ぶ場合はキャストすればよい printf( "int=%d, double=%f, string=%s\n", (int)integer, (double)integer, ((std::string)integer).c_str() ); // 関数に渡す時も自動でキャストしてくれます。 Print( integer, integer, integer ); return 0; }
出力: int=10, double=10.000000, string=10 int=10, double=10.000000, string=10 int=10, double=10.000000, string=10
これを利用すると見た目が非常にすっきりしコンパイラの警告を 抑止する為だけに行っていたキャストを省略することができます。 To○○系の変換メソッドを作成してもよいのですがキャスト演算子の使用も 便利だと思いますので状況に応じてご判断下さい。 キャスト演算子のオーバーロードはテンプレートも使えます。
テンプレートを用いたサンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <cstdio> // printfに必要なヘッダー #include <string> // stringに必要なヘッダー // 整数クラス class Integer { private: int m_Int; public: Integer(int i = 0) { m_Int = i; } // テンプレートを利用したキャスト演算子のオーバーロード template <class T> operator T() const { return (T)m_Int; } // std::stringキャスト演算子のオーバーロード operator std::string() const { char buffer[16] = {}; sprintf( buffer, "%d", m_Int ); return buffer; } }; int main() { Integer integer = 65; printf( "char=%c short=%d int=%d, float=%f double=%f, string=%s\n", (char)integer, (short)integer, (int)integer, (float)integer, (double)integer, ((std::string)integer).c_str() ); return 0; }
出力: char=A short=65 int=65, float=65.000000 double=65.000000, string=65
カテゴリ

リンク
C++11のコードを
試すのに便利です。
http://ideone.com/

同人ゲームを
製作している知人
sorcery

にほんブログ村 IT技術ブログ C/C++へ
にほんブログ村


C++ ブログランキングへ

ゲームダウンロード DefenceTri