勤め先が変わりました。
まあでも通うオフィスは同じなんですけどね。
2010年9月30日木曜日
false としか比較できない bool みたいなもの
Twitter やってると全然ブログ更新しなくなってしまいますね。
整数値をキャストするとゼロなら偽、それ以外なら真になる。
でもそんなとき #define TRUE (1) なんかと比較するとゼロでない何らかの数値は
"1"とは限らないので具合が悪い。なので偽を表す定数としか比較できないように
したい。
…というような要件の解決を試みるコード。
整数値をキャストするとゼロなら偽、それ以外なら真になる。
でもそんなとき #define TRUE (1) なんかと比較するとゼロでない何らかの数値は
"1"とは限らないので具合が悪い。なので偽を表す定数としか比較できないように
したい。
…というような要件の解決を試みるコード。
#include <boost/static_assert.hpp> // nil かそれ以外の状態を持つ型 enum flag_t { nil = 0 }; // 以下のオペレーターは実装されない bool operator ==( flag_t, bool ); bool operator ==( flag_t, int ); bool operator ==( flag_t, float ); bool operator !=( flag_t, bool ); bool operator !=( flag_t, int ); bool operator !=( flag_t, float ); bool operator ==( bool , flag_t ); bool operator ==( int , flag_t ); bool operator ==( float, flag_t ); bool operator !=( bool , flag_t ); bool operator !=( int , flag_t ); bool operator !=( float, flag_t ); // enum のサイズって int と同じだっけ? BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( bool ) ); BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( int ) ); BOOST_STATIC_ASSERT( sizeof( flag_t ) >= sizeof( float ) );
void func() { const flag_t flg = someFunc(); // 真なら通る条件文 if ( flg ) { /* ... */ } // 偽なら通る条件文 if ( flg == nil ) { /* ... */ } // 以下はリンカエラーを起こす if ( flg == false ) { /* ... */ } if ( flg == 12345 ) { /* ... */ } if ( flg == 1.23f ) { /* ... */ } }
2010年7月10日土曜日
リフレクション実装を改善してみた。
7月8日のポストで提示したサンプルコードには、ひどい仕様があったため
新しいバージョンのソースをアップします(7月8日の記事へジャンプする)。
[サンプルソースをダウンロード]
*このソースを利用した事による一切の現象について責任を負いかねます。
具体的な問題を解説するとクラス要素をリフレクトする際に間違った型で
受けても無理矢理キャストが成立してしまい、結果非常にまずい動作を引き
起こしてしまう可能性がありました。
この対処のために動的な型チェックを行うようにしました。
型チェックはRTTIを使わず独自に実装しています。
Objectクラスを継承しクラス宣言にマクロ CLASS_DECL(<クラス名>) を
配置すれば型チェック機能が有効になります。もちろん、Refelectableも
Objectを継承しています。
新しいバージョンのソースをアップします(7月8日の記事へジャンプする)。
[サンプルソースをダウンロード]
*このソースを利用した事による一切の現象について責任を負いかねます。
具体的な問題を解説するとクラス要素をリフレクトする際に間違った型で
受けても無理矢理キャストが成立してしまい、結果非常にまずい動作を引き
起こしてしまう可能性がありました。
この対処のために動的な型チェックを行うようにしました。
型チェックはRTTIを使わず独自に実装しています。
class MyObj : public Object { CLASS_DECL( MyObj ); //... };
Objectクラスを継承しクラス宣言にマクロ CLASS_DECL(<クラス名>) を
配置すれば型チェック機能が有効になります。もちろん、Refelectableも
Objectを継承しています。
2010年7月8日木曜日
リフレクションを実装してみた。
リフレクションをC++で実装してみました。
ただし、名前によるメンバ変数へのアクセスを提供するのみで
本来リフレクションという言葉で定義される全てを満しません。
[サンプルソースのダウンロード]
サンプルソースを更新しました。内容と新しいソースについては
7月10日の記事を確認してください。→その記事へジャンプ
ZIPアーカイブにはVisual Studio 2008のプロジェクトファイルと
ソースコードが含まれています。
サンプルはBoost ver.1.43.0を利用しますのでメイクする際には
Boostを落として[ツール >> オプション]あたりでインクルードパスを
通しておいて下さい。
なお、サンプルによって生じたいかなる現象についても責任を
負いかねますのでご了承下さい(単純なソースですけどね)。
以下利用方法を解説します。
まずReflectableクラスを継承したクラスを宣言します。
名前アクセスを行いたいメンバ変数(リフレクト要素)を追加していきます。
Reflectableを継承していなければなりません。
宣言された要素はコンストラクトのタイミングで要素を登録します。
登録はマクロ経由の関数コールで行います。
ただし、名前によるメンバ変数へのアクセスを提供するのみで
本来リフレクションという言葉で定義される全てを満しません。
サンプルソースを更新しました。内容と新しいソースについては
7月10日の記事を確認してください。→その記事へジャンプ
ZIPアーカイブにはVisual Studio 2008のプロジェクトファイルと
ソースコードが含まれています。
サンプルはBoost ver.1.43.0を利用しますのでメイクする際には
Boostを落として[ツール >> オプション]あたりでインクルードパスを
通しておいて下さい。
なお、サンプルによって生じたいかなる現象についても責任を
負いかねますのでご了承下さい(単純なソースですけどね)。
以下利用方法を解説します。
まずReflectableクラスを継承したクラスを宣言します。
名前アクセスを行いたいメンバ変数(リフレクト要素)を追加していきます。
class MyObj : public Reflectable { public : Sample() { registerElements(); } ~Sample() {} private : void registerElements();// 解説後述 private : Element<int> m_number;// 整数値要素 Element<Child> m_obj;// 静的配置クラス要素 Element<Child*> m_pObj;// クラスポインタ要素 };要素としてクラスを格納する際はそのクラス(この場合はChild)も
Reflectableを継承していなければなりません。
宣言された要素はコンストラクトのタイミングで要素を登録します。
登録はマクロ経由の関数コールで行います。
void Sample::registerElements() { // 以下のマクロは // Reflectable::registerElementをコールする REGISTER_ELEM( m_number ); REGISTER_ELEM( m_obj ); REGISTER_ELEM( m_pObj ); }あとは次のような記述で名前アクセスが可能です。
Sample sample; int& n = sample.reflect( "m_number" );// 参照の取得
2010年3月21日日曜日
2010年3月10日水曜日
2010年1月21日木曜日
2010年1月13日水曜日
最近のうちのゲーム機事情
XBOX360のHDDを20GBから120GBに交換
↓
ついにPS3(薄型)購入
↓
XBOXが壊れた(前に修理したので2度目)
↓
また壊れたら嫌なのでXBOX360アーケードを購入
金かかるなあ。
↓
ついにPS3(薄型)購入
↓
XBOXが壊れた(前に修理したので2度目)
↓
また壊れたら嫌なのでXBOX360アーケードを購入
金かかるなあ。
登録:
投稿 (Atom)