|
|
[C#]文字列からbyte配列(SJIS)に変換 |
2014年11月23日01:42:01 |
|
次のコードで文字列からbyte配列(SJIS)に変換が可能です。 |
1
2
| string text = "文字列";
byte[] data = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(text + "\0"); |
疑問に思われたかもしれませんが最後に"\0"をくっつけています。
stringには終端文字('\0')が存在しないので、何もしないとbyte配列に含まれない事態に陥ります。
ネイティブな関数に渡す場合に悲惨なことになるのでご注意ください。
ちなみに元の文字列textに"\0"をくっつけてしまうとC#で扱う場合面倒なことになるので
GetBytesの時点でくっつけるのがベストだと思います。 |
|
[C++11]static_assert(コンパイル時エラー検出)とtype_traits |
2014年11月22日23:03:15 |
|
メタ(テンプレートを使った)プログラミングを加速する為にstatic_assertは導入したいものです。
これまでテンプレートを利用した関数は実行時まで挙動がどうなるか分かりませんでした。
変な出力を返す事もあれば、落ちることもあります。
そこで活用したいのがstatic_assertです!
単体では役に立たないのでtype_traitsと呼ばれる型をチェックする機能との併せ技になります。 |
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
| #include <type_traits>
#include <cstdio>
template <class T>
void Print( T data )
{
static_assert( std::is_same<T,int>::value, "NotSuppurtType" );
printf( "%d\n", data );
}
Print(0);
Print('\0');
Print(0.0f);
|
コンパイル時に判別が出来て非常に便利ですね!
type_traitsには様々な判定方法があるので詳しく知りたい方は
リファレンスを見るか丁寧に解説されているサイトをご覧下さい。
さて上記サンプルは%dで出力したいだけなので整数なら何でもよかったりします。
整数と実数の判定が用意されているので書き換えてみます。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include <type_traits>
#include <cstdio>
template <class T>
void Print( T data )
{
static_assert( std::is_integral<T>::value, "NotSuppurtType" );
printf( "%d\n", data );
}
Print(0);
Print('\0');
Print(0.0f); |
実数判定の場合 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| #include <type_traits>
#include <cstdio>
template <class T>
void Print( T data )
{
static_assert( std::is_floating_point<T>::value, "NotSuppurtType" );
printf( "%f\n", data );
}
Print(0);
Print('\0');
Print(0.0f); |
最後に注意点です。
型を知るための類似機能としてtypeid演算子がありますが
こちらは実行時型情報の機能なのでstatic_assertの中に混ぜて利用することは出来ません。
間違いやすいポイントだと思うのでご留意下さい。
ちなみにsizeof演算子はコンパイル時にサイズが分かるのでこちらは使えます。 |
|
[C++11]NULLとはおさらばnullptr |
2014年11月22日02:09:11 |
|
C++11からnullptr(無効なポインタ)が型として採用されました。
やったー。これは積極的に使うべきです。
これまではマクロが定義されていただけなので飛躍的な進歩と言えます。
#define NULL 0
個人的に一番大きなメリットはNULLを使う場合に必要だった
何かしらのヘッダーファイルのインクルードが不要になることです。 |
1
2
3
4
| #include <cstdlib>
int* p1 = NULL;
int* p2 = nullptr; |
あとは型として定義づけが行われたおかげで関数・メソッドの
オーバーロードもやりやすくなりました。
普通の人はこっちのメリットが主でしょうね(汗 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #include <cstdio>
void hoge( int i )
{
printf( "A" );
}
void hoge( int* i )
{
printf( "B" );
}
hoge( NULL );
hoge( nullptr ); |
余談ですが、筆者はキーワード名が気に入りません他の言語ではnullというキーワードを
使うことが多いので、C++もnullが良かったです...
C++/CLIから逆輸入ということなので政治的な理由なのでしょうが無念です。
nilとかいうキーワードを採用していたC#の前身や某組み込み言語も…いえ何でもありません |
|
|