久しぶりに C++ プログラミング

丸2年ぐらい C++ でコードは書いていなかった気がする。Win32 の DLL をプラグイン的に取り込むソフトのために使ったのだが、色々忘れてますね。
途中でメンバに const 付け歩きとか、代入でコピーコンストラクタが呼ばれなくて…、とか。

enum plan
{
  plan1, plan2, plan3, ...
};

void Foo::DoPlan1(a, b, c);
void Foo::DoPlan2(a, b, c);
  :

currentPlan = plan2;
switch (currentPlan)
{
  case 1: this->DoPlan1(a, b, c); break;
  case 2: ...
        :
}

みたいなのを、あとからどんどん要素を増やすのに switch はナイダローと、C#delegate を使うかんじでメソッドポインタで、

void (Foo::*DoPlan)(a, b, c);

DoPlan currentPlan = &Foo::DoPlain1;
  :

(this->*currentPlan)(a, b, c);

と、->* 演算子で書きましたが、->* 演算子なんて使ったのは、実に8年振りぐらいだと思います。

  • >* 演算子って、すごいマイナーなきがするんですが*1Delphi やら C# やらでは、普通にオブジェクトのインスタンスとメソッドが関連づいたメソッドポインタとして delegate や procedure of object があって、MethodBase 型やら DynamicMethod 型やら、呼び出しでインスタンスやメソッドを個別に入れ替えが簡単にできるので、結構それなりに活用していると思うんですが、C++ で ->* 演算子をあまりつかってないということは、そういう手法を滅多に使ってなかったんだっけなあ...と思ってしまいました。*2

あと、やはり IDE の動作が重ったるい。#define の評価とか、大変そうだしなー。ヘッダファイル側にメソッド書いて、cpp ファイル側で中々補完対象にならなかったり、-> って記述してメンバの一覧がなかなか出せなかったり。CLRホスティングして適当なクラスを生成するだけのスタブをつくるのがよさげなきがしまくり。*3

*1:私がそう思ってるだけ?

*2:仮想関数でやってたのかもしんない

*3:ホストプログラムからみれば、プラグイン的に読み込んだ DLL が CLRホスティングしようとするのは、プロセスという共有空間にたいしておおきな足枷を作成してしまうそうで、怖いんですけどね