[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>
#include <string>
class Integer
{
private:
int m_Int;
public:
Integer(int i = 0)
{
m_Int = i;
}
operator int() const
{
return m_Int;
}
operator double() const
{
return (double)m_Int;
}
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;
double d = integer;
std::string s = integer;
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>
#include <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;
}
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 |
|