次の方法でポリシー パターンを実装するために、boost typelist を使用しています。
using namespace boost::mpl;
template <typename PolicyTypeList = boost::mpl::vector<> >
class Host : public inherit_linearly<PolicyTypeList, inherit<_1, _2> >::type
{
public:
Host() : m_expensiveType(/* ... */) { }
private:
const ExpensiveType m_expensiveType;
};
このHost
クラスは、コストのかかる操作である のインスタンスを作成する方法を認識してExpensiveType
おり、各ポリシー クラスはそれを使用する機能を公開しています。ポリシー クラスには常に、次のサンプル ポリシーで定義されたコンストラクターが最小限含まれます。
struct SamplePolicy
{
SamplePolicy(const ExpensiveType& expensiveType)
: m_expensiveType(expensiveType) { }
void DoSomething()
{
m_expensiveType.f();
// ...
}
private:
const ExpensiveType& m_expensiveType;
};
Host
指定された各ポリシーのコンストラクターを呼び出すような方法でコンストラクターを定義することは可能ですか? タイプ リストが含まれていない場合、各ポリシーのタイプが明示的に知られているため、これは非常に簡単です。
template <typename PolicyA, typename PolicyB>
class Host : public PolicyA, public PolicyB
{
public:
Host() :
m_expensiveType(/* ... */),
PolicyA(m_expensiveType),
PolicyB(m_expensiveType) { }
private:
const ExpensiveType m_expensiveType;
};
boost::mpl::for_eachアルゴリズムは有望に見えますが、それを使用してこの問題を解決する方法について頭を悩ますことはできません。