如果你想要这样的一代,我只能推荐读一下Alexandrescu的书现代 C++ 设计。有整整一章专门讨论从类型列表生成层次结构。您还可以在 Loki 的网站上找到它:层次结构生成器;尽管您会错过图表和解释以及过程。
对于您的特定问题,这似乎非常简单。
// Helper
struct nil
{
};
template < class Head, class Tail = nil>
struct SH: Head<Tail> /* for SimpleHierarchy */
{
SH(const ExpensiveType& e): Head(e), SH<Tail>(e) {}
};
template<>
struct SH<nil,nil>
{
SH(const ExpensiveType& e) {}
}:
// Policies
class A
{
public:
A(const ExpensiveType& e) : T(e), m_e(e) {}
private:
const ExpensiveType& m_e;
};
class B
{
public:
B(const ExpensiveType& e) : T(e), m_e(e) {}
private:
const ExpensiveType& m_e;
};
class C
{
public:
C(const ExpensiveType& e) : T(e), m_e(e) {}
private:
const ExpensiveType& m_e;
};
// Use
// nesting example
typedef SH<A, SH<B,C> > SimpleHierarchy;
// Your example, revisited
template <class A, class B>
class Host: SH<A,B>
{
public:
Host(const ExpensiveType& e): SH<A,B>(e), m_e(e) {}
private:
const ExpensiveType& m_e;
};
当然,这只是一个草图。这里的主要问题是可扩展性。如果您阅读 Alexandrescu 的书,您会学到更多,如果您没有时间,请仔细阅读源代码,这可能会证明您所需要的。
有一些方法可以直接从mpl::vector
,唯一要认识到的是,你不能用大 MI 单层来做到这一点,但你可以添加很多层。
在这里,我选择不在策略级别增加复杂性(它们没有模板化),而是在每个级别依赖 MI(双重)。您可以使其成为纯线性的,但模板化您的策略意味着您无法在源文件中定义它们。
另请注意,此方法可以适用于mpl::vector
直接,但这将涉及使用元模板编程操作:back
, pop_back
and empty
至少,这可能会使代码变得更加混乱,而不是真正有帮助。