C++プログラマ キャスブログ
[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> // type_traitsを利用する為のヘッダー #include <cstdio> // prinfを使うためのヘッダー // intしか受け付けないサンプル template <class T> void Print( T data ) { // std::is_same<型1, 型2> value 等しい:true 等しくない:false static_assert( std::is_same<T,int>::value, "NotSuppurtType" ); printf( "%d\n", data ); } // OK Print(0); // char型なのでコンパイルエラー Print('\0'); // float型なのでコンパイルエラー Print(0.0f); // Visual C++ではこんな文言がでます。 // error C2338: NotSuppurtType // コンパイルされたクラスの テンプレート のインスタンス化 // 'void Print<char>(T)' の参照を確認してください // error C2338: NotSuppurtType // コンパイルされたクラスの テンプレート のインスタンス化 // 'void Print<float>(T)' の参照を確認してください
コンパイル時に判別が出来て非常に便利ですね! 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> // type_traitsを利用する為のヘッダー #include <cstdio> // prinfを使うためのヘッダー // 整数しか受け付けないサンプル template <class T> void Print( T data ) { // 整数判定 static_assert( std::is_integral<T>::value, "NotSuppurtType" ); printf( "%d\n", data ); } // OK Print(0); // OK 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> // type_traitsを利用する為のヘッダー #include <cstdio> // prinfを使うためのヘッダー // 実数しか受け付けないサンプル template <class T> void Print( T data ) { // 実数判定 static_assert( std::is_floating_point<T>::value, "NotSuppurtType" ); printf( "%f\n", data ); } // 整数型なのでコンパイルエラー Print(0); // 整数型なのでコンパイルエラー Print('\0'); // OK 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> // NULLの場合宣言があるヘッダーが無いとコンパイルエラーになる。 int* p1 = NULL; int* p2 = nullptr; // nullptrの場合ヘッダーファイルは不要
あとは型として定義づけが行われたおかげで関数・メソッドの オーバーロードもやりやすくなりました。 普通の人はこっちのメリットが主でしょうね(汗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <cstdio> // printfを使うために必要なヘッダー void hoge( int i ) { printf( "A" ); } void hoge( int* i ) { printf( "B" ); } // NULLは0のマクロなのでAが出力される hoge( NULL ); // nullptrは型なのでオーバーロードが正しく動作しBが出力される hoge( nullptr );
余談ですが、筆者はキーワード名が気に入りません他の言語ではnullというキーワードを 使うことが多いので、C++もnullが良かったです... C++/CLIから逆輸入ということなので政治的な理由なのでしょうが無念です。 nilとかいうキーワードを採用していたC#の前身や某組み込み言語も…いえ何でもありません
カテゴリ

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

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

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


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

ゲームダウンロード DefenceTri