Я использую список типов Boost для реализации шаблона политики следующим образом.
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 Алгоритм выглядит многообещающе, но я не могу понять, как использовать его для решения этой проблемы.
Host
таким образом - посколькуinherit_linearly
строит цепочку наследования, вам придется каким-то образом связать вызовы конструктора, т.е. позволитьHost
вызывать его для наиболее производного, наиболее производного для следующего и т. д. - person Georg Fritzsche   schedule 04.11.2009