「C++/Policy」の編集履歴(バックアップ)一覧はこちら

C++/Policy」(2008/11/11 (火) 12:59:00) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

** Policyクラス 継承を使用した場合、実行する仮想関数は実行時に解決される(動的多態性)のに対し、 Policyクラスを使用するとコンパイル時に解決される(静的多態性)。~ つまり、Policyクラスを使用するとコンパイル時間を犠牲にパフォーマンスを向上できる。 (まあ仮想関数のオーバーヘッドがどれくらいか実測してないから知らないが)~ その他の利点として外部から動作を拡張できる点も挙げられる。 注意点として、Policyクラスのデストラクタはprotected非仮想にしなければならない。~ (Policyクラスのポインタでdeleteさせない & 仮想関数のオーバーヘッドを防ぐため) ***例 #codehighlight(C++){{ s struct PolicyA { void func1() { std::cout << "A's func1" << std::endl; }; protected: ~PolicyA() {}; void DoFunc2() { std::cout << "A's func2" << std::endl; }; }; struct PolicyB { // PolicyBにのみ実装している関数 void func() { std::cout << "B's func" << std::endl; }; void func1() { std::cout << "B's func1" << std::endl; }; protected: ~PolicyB() {}; void DoFunc2() { std::cout << "B's func2" << std::endl; }; }; template <class policy> struct PolicyHolder : public policy { void func2() { std::cout << "call func2" << std::endl; policy::Dofunc2(); }; }; int main() { PolicyHolder<PolicyA> a; PolicyHolder<PolicyB> b; a.func1(); b.func1(); a.func2(); b.func2(); b.func(); // 問題なし return 0; } }} ----
** Policyクラス 継承を使用した場合、実行する仮想関数は実行時に解決される(動的多態性)のに対し、 Policyクラスを使用するとコンパイル時に解決される(静的多態性)。~ つまり、Policyクラスを使用するとコンパイル時間を犠牲にパフォーマンスを向上できる。 (まあ仮想関数のオーバーヘッドがどれくらいか実測してないから知らないが)~ その他の利点として外部から動作を拡張できる点も挙げられる。 注意点として、Policyクラスのデストラクタはprotected非仮想にしなければならない。~ (Policyクラスのポインタでdeleteさせない & 仮想関数のオーバーヘッドを防ぐため) ***例 #codehighlight(C++){{ struct PolicyA { void func1() { std::cout << "A's func1" << std::endl; }; protected: ~PolicyA() {}; void DoFunc2() { std::cout << "A's func2" << std::endl; }; }; struct PolicyB { // PolicyBにのみ実装している関数 void func() { std::cout << "B's func" << std::endl; }; void func1() { std::cout << "B's func1" << std::endl; }; protected: ~PolicyB() {}; void DoFunc2() { std::cout << "B's func2" << std::endl; }; }; template <class policy> struct PolicyHolder : public policy { void func2() { std::cout << "call func2" << std::endl; policy::Dofunc2(); }; }; int main() { PolicyHolder<PolicyA> a; PolicyHolder<PolicyB> b; a.func1(); b.func1(); a.func2(); b.func2(); b.func(); // 問題なし return 0; } }} ----

表示オプション

横に並べて表示:
変化行の前後のみ表示:
人気記事ランキング
目安箱バナー