2010年10月30日土曜日

ご連絡

勤め先が変わりました。
まあでも通うオフィスは同じなんですけどね。

2010年9月30日木曜日

false としか比較できない bool みたいなもの

Twitter やってると全然ブログ更新しなくなってしまいますね。


整数値をキャストするとゼロなら偽、それ以外なら真になる。
でもそんなとき #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を使わず独自に実装しています。

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クラスを継承したクラスを宣言します。
名前アクセスを行いたいメンバ変数(リフレクト要素)を追加していきます。
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日日曜日

コズミックスマッシュ



…があったので遊んでみた。
んでもってクリアした(一番 easy なルートだろうけど)。
移植されないかな-。

2010年3月19日金曜日

とある雑誌に写真が載りました。
そんな訳でちょっと前に東京に引っ越してました。

2010年3月10日水曜日

アンプが直った

PCとゲーム機につないでるアンプが故障して
修理に出してたんですが帰ってきました。

PCはヘッドホンをサウンドに直刺しできますが、
ゲームはどうにもならず…これでやっとプレイできる
ってもんです。

2010年3月5日金曜日

お久しぶりです。

今日写真撮ってもらいました。
うむむ。

2010年1月21日木曜日

ちょっとした用事で、

新幹線に乗ったんだけど
マーティー・フリードマンらしきひとを見たよ。

2010年1月13日水曜日

最近のうちのゲーム機事情

XBOX360のHDDを20GBから120GBに交換

ついにPS3(薄型)購入

XBOXが壊れた(前に修理したので2度目)

また壊れたら嫌なのでXBOX360アーケードを購入

金かかるなあ。