gpt4 book ai didi

c++ - 如何为类型列表中的每个继承类型调用非默认构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:02 25 4
gpt4 key购买 nike

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

最佳答案

如果你想要这样的一代,我只能推荐阅读 Alexandrescu 的 Modern C++ Design .有一整章专门介绍从类型列表生成层次结构。您也可以在 Loki 的网站上找到它:Hierarchy Generators ;尽管您会错过图表和解释以及过程。

对于您的特定问题,这似乎非常简单。

// 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,但这将涉及元模板编程操作的使用:backpop_backempty 至少,这可能会混淆代码而不是实际帮助。

关于c++ - 如何为类型列表中的每个继承类型调用非默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1671297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com