Top Page > C++ 小物集 > 封印されし物


封印されし物


Boostで既出だったために封印されたライブラリ達。Boostに依存させたくない時に役に立つ…かも(笑)。とか言ってたら、本当に課題の時に役立ったり。

統合関数オブジェクト unified_functor

関数オブジェクトをtemplateで受け取りたくない時に。同じ引数型&戻り値型を持つ関数オブジェクト&関数ポインタを1つの型に代入できます。boost::functionがこれとほぼ同じ。
サンプル:
int Minus(int i, int j){return i-j;}

binary_unified_functor<int, int, int> func= Minus;
int r1= func(12, 7); //i.e. r1= 12-7;
func= plus<int>();
int r2= func(12, 7); //i.e. r2= 12+7;
gcc3/BCC:ソース  VC7.0以下:非対応

クロージャ closure

特定のオブジェクトの特定のメンバ関数の呼び出しを、関数オブジェクトに変換します。統合関数オブジェクトと組み合わせると、BCBのクロージャを実現できます。boost::bindで同じ事を実現できます。
サンプル:
struct A{
 int f(int i){ ... }
};


A a;
unary_unified_functor<int, int> func= closure(&a, &A::f);
int j= func(3); //i.e. j= a.f(3);
gcc/BCC/VC7:ソース  VC6以下:非対応

チェック付き動的型変換 checked_cast & assert_cast

checked_cast:
「このdynamic_castは成功する必要がある」という時に。ポインタのdynamic_castだが、キャストに失敗するとstd::bad_cast例外を発生する。boost::polymorphic_cast*3がコレですね。
assert_cast:
「このキャストが失敗するはずがない」という時に。デバッグ時はchecked_cast、リリース時はstatic_castとして働く。デバッグ時は_DEBUGをdefineしておく必要がある。boost::polymorphic_downcast*3がコレです。
サンプル:
Base* pb= ...
Derived* pd= checked_cast<Derived*>(pb);
BCC/VC:ソース  gcc:未確認

*1 「BCC」はBCB4 Lea、BCB6 Proで確認。「VC」はVC6 Std、VC7 Stdで確認。「gcc」はgcc 2.95(cygwin)で確認。
*2 サンプルではusing、#includeを省いています。
*3 名前だけはBoostに勝ったと思う今日この頃(笑)。分かりにくいっす。
*4 ご意見はgimite@mx12.freecom.ne.jpまで。


更新履歴

2004/2/13 空のunified_functorをコピーするとNULLアクセスが起きるバグを修正。
クロージャをちょっと改良。
2002/6/30 gccで動作確認。「統合関数オブジェクト」gcc版をUP。
2002/6/28 「統合関数オブジェクト」のbasic_*ary_callに仮想デストラクタを追加。
2002/6/27 「チェック付き動的型変換」追加。名前空間をgstdからgimiteに変更。
2002/4/18 「統合関数オブジェクト」「クロージャ」公開。


封印されし物 < C++ 小物集 < TopPage