「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;
}
}}
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: