...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

VS2005とPolicy

Modern C++ Design を読んでポリシーという概念がわかってきた.
あるサービスを実現するクラスがあったとして,そのクラスが持つ機能をコンパイル時に複数ある候補の中から選択できるように作る方法なんだな.
OOP の常套句,ポリモーフィズムを使っても同じことができるけど,実行時に切り替えるか,コンパイル時に切り替えるかが違うから,相補的な関係にある,と.

ところで, VS2005 でコードをいじってみて驚いた.
インテリセンス(ドットを打ったときにクラスのメンバを表示してくれる機能)が賢くなったと聞いていたけど,ここまでとは思わなかった.

説明とサンプルコードは続きをどうぞ.


001 #include <iostream>
002 using namespace std;
003
004 struct PolicyA
005 {
006 void run()
007 {
008 cout << A << "\n";
009 }
010 };
011
012 struct PolicyB
013 {
014 void run()
015 {
016 cout << B << "\n";
017 }
018 void extention()
019 {
020 cout << "Extention\n";
021 }
022 };
023
024 template<typename Policy = PolicyA>
025 struct Service : public Policy
026 {
027 };
028
029 int main(int argc, char argv[])
030 {
031 Service<PolicyA> a;
032 a.run(); // ちゃんとインテリセンスが効く!!
033
034 Service<PolicyB> b;
035 b.run(); // ちゃんとインテリセンスが効く!!
036 b.extention(); // ちゃんとインテリセンスが効く!!
037
038 return 0;
039 }


以下,出力結果.


A
B
Extention

Service クラスは,テンプレートパラメータに与えられたポリシークラスを継承している.
つまり, Service<PolicyA> のメンバは run() のみで, Service<PolicyB> のメンバは run() と extention() の2つ.
こんなときでもちゃんと a と b の両インスタンスに対してインテリセンスが効く.
これを実現するためには,テンプレートパラメータに与えられたクラスを解析して,それを継承していることを認識しないといけない.
うーん,そこまでしているとは・・・まいりました.

# しかし,VS2003 に比べてやけに重いのはこのせいか・・・(^^;