2006-02-17-01-Functor、でいいのか?
>> Site top >> weblog >> 月別アーカイブ >> 2006年02月のlog >> 2006-02-17-01-Functor、でいいのか?
最終更新日付:2006/02/17 01:00:00
Functor、でいいのか?
2006 年 02 月 17 日
えぇと、VBGeneric の話ですごめんなさい(と先に謝っておく)。
いきなりだが C++ の演算子オーバーロードをご存知だろうか。たとえば、自作のクラス Foo に対して以下のような大域比較演算子を定義しておくと、
bool operator==( const Foo& foo1, const Foo& foo2 );
...Foo のオブジェクトに対して比較演算子 == を使用することができるようになる。演算子オーバーロードは、クラスを組み込み型のように扱えるようにするための仕組みだ。その他にも色々な演算子がオーバーロードできるようになっているが、その中には関数呼出し演算子(て名前だったかな)もある。これは、オブジェクトを関数ポインタのように扱えてしまうというものだ。
以下のようなクラス FooFunc があると、
class FooFunc { public: int operator( )( int arg1, int arg2 ) { return arg1 + arg2; }; };
...FooFunc のオブジェクトを作成して以下のようなことができる。
FooFunc func; int ret = func( 5, 3 );
この演算子オーバーロード、テンプレートと組み合わせるとその真価を発揮する。テンプレートパラメータに組込み型とユーザー定義タイプを分け隔てなく指定できるようになるからだ。STL の関数オブジェクトもこの operator( ) を利用している。これによって、アルゴリズムのテンプレートに関数ポインタを渡したり関数オブジェクトを渡したりできるわけだ。そして STL を真似している VBGeneric にも関数オブジェクトは存在する。ところで、関数オブジェクトのほかにファンクタという呼び方もあるようだが、Functor という綴りでいいのだろうか? 辞書に載ってないんだよなそんなの。
話を戻そう。Visual Basic には当然演算子オーバーロードなどというものはない。だから、VBGeneric の関数オブジェクトである UnaryFunction や BinaryFunction ではExecute( ) というメソッドを用意する。しかし、ここでも前回のバージョンアップでのAt プロパティと同じことができてしまうのだ。つまり、Execute( ) を既定のメソッドに指定することで、まさにファンクタのように使えてしまえるようになるのである。先のFooFunc の使用例をそのまま VBGeneric に当てはめると以下のようになるだろう。
Dim func As New FooFunc Dim ret As Long ret = func( 5, 3 )
...と、まぁこんな仕様変更を思いついたわけだ。というか、コンテナやランダムアクセス反復子の At プロパティを既定化するときに気づくべきだったのだが。というわけでまぁこれを早いとこ対応してしまおうとしている...修正は2時間くらいで終わるもののリファレンスマニュアルが時間がかかりそう。
しかし。話はこれでは終わらない。Visual Basic の(変な)仕様が原因で、どうもこの既定のメソッドが使用できない局面があるのだ。調べた限りでは、スコープ外のオブジェクト(要するにクラスメンバとか大域オブジェクト)に対して復帰値を利用しないような記述をした場合にエラーが発生する...まぁそれはそういうものとして提供するしかないか。
コメント
このページのタグ
Page tag : STLとその移植
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.