我正在使用 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算法看起来很有希望,但我不知道如何使用它来解决这个问题。