メンバ関数へのポインタ

問題です。以下の C++ のコードがどのくらいの数値を出力するかどうかを予想して、実際に確かめてみて下さい。

#include <stdio.h>
struct C {
    void f() {}
    virtual void vf() {}
};
int main() {
    printf("%p\n", &C::f);
    printf("%p\n", &C::vf);
}

まぁうちだと 0x804847c, 0x1 だったわけですが、要は仮想関数の場合、関数ポインタじゃなくて仮想関数テーブル内のインデックスを保持するわけ。これが Java だとか C++ だとかで、 sumimさんのメンタルモデルが裏切られた 理由なわけですが、通常これはありがたいわけです。これが無いとまともな mem_fun は書けません。

まともな memfun

で、 D はメンバ関数へのポインタが本当にメンバ関数へのポインタなので使えないわけです。以前書いた こんないいかげんなのだと多態できない(つまりsumimさんのメンタルモデルが裏切られない)わけですが。なんかいつ書いたかわからんけど多態できるバージョンがあったので、適当に今の D 風に引数の個数制限とか無いバージョンを作ってみました。たぶん C++ の mem_fun に期待する通りの動きなのではないかと。

http://d.shinh.org/html/toy/shinh/memfun.html

問題があるとしたら vtbl を実行時に線型探索することと final ついてる関数は実行時 assertion になるくらいでしょうかね。 final の場合もよろしくやってくれるのも作ってもいいんですけど、まぁ私的に需要無いので省略。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h