私は実際にはポリシーベースのデザインを実際に使ったことはありません。それはC++でコーディングして以来の年ですが、ここに私の解釈があります。あなたが指摘したように、ホストクラスは、インタフェースを使って、またはのようなものを使って、wikiの例で示されているように、使用されているポリシーに制約を強制することができます。
使用方法の利点(または相違点)は、ポリシーが使用するコードによって直接表される暗黙的な契約を持つため、事前の制限が少なく、厳格性が低いことです。 usingの例では、output_policy実装はPrintというメソッドを実装するだけで、何も返さず、language_policy :: Message()が返すものをすべて取ります(この場合、すべてのlanguage_policiesがstd :: stringを返します) 。これはアヒルのタイピングにもう少し近いです。
1つの欠点は、コードがなくなると暗黙の契約が消えることです。別の欠点は、ポリシーが互いにある程度の依存関係を持つことです。非常に工夫された例として、output_policyに文字列だけを出力するnon-generic Printメソッドがある場合、整数だけを出力するlanguage_policyでは使用できません。
なぜ必要な場合にポリシーインターフェースを追加できないのかわかりません。 1つの例は、HelloWorldクラスがoutput_policyを文字列とそれ以外のものを出力するように制約したい場合です。これを実現するには、以下のようなコードを書くことができます。output_policy<std::string>
が実際にOutputPolicyInterface<std::string>
を実装するようにSFINAEを使用する必要があることに注意してください。
template<typename message_type>
class OutputPolicyInterface
{
virtual void Print(message_type message) = 0;
};
template <template<class> class output_policy, typename language_policy>
class HelloWorld : public output_policy<std::string>, public language_policy
{
public:
void Run()
{
Print(Message());
//Print(2); won't work anymore
}
};